在使用CSOM进行初始部署之后,将SharePoint列表webpart添加到特定页面

问题描述:

在部署我的SharePoint站点期间,我创建了一些我想以编程方式添加到主页的列表,但找不到任何可用的东西。在使用CSOM进行初始部署之后,将SharePoint列表webpart添加到特定页面

现在,我得到了以下错误:

The property or field 'SchemaXml' has not been initialized. 
It has not been requested or the request has not been executed. 
It may need to be explicitly requested.' 

这里说的部署过程中创建的清单代码:

ArrayList arrFields = new ArrayList(); 
     arrFields.Add(fieldBody); 
     arrFields.Add(fieldPublishStartDate); 
     arrFields.Add(fieldPublishStopDate); 
     arrFields.Add(fieldReadMore); 

     //create the home page content lists 

     List FeaturedStories = CreateList(ctx, currentWeb, "Featured Stories", ListTemplateType.PictureLibrary, arrFields, true); 
     CreateList(ctx, currentWeb, "Team Spotlight", ListTemplateType.PictureLibrary, arrFields, true); 
     List quickLinks = CreateList(ctx, currentWeb, "Quick Links", ListTemplateType.Links, null, true); 
     List resourceLinks = CreateList(ctx, currentWeb, "Resource Links", ListTemplateType.Links, null, true); 

     arrFields.Remove(fieldBody); 
     List announcementsList = CreateList(ctx, currentWeb, "News and Announcements", ListTemplateType.Announcements, arrFields, true); 
     List eventsCalendarList = CreateList(ctx, currentWeb, "Events Calendar", ListTemplateType.Events, arrFields, true); 

     ctx.Load(currentWeb, w => w.Lists); 
     ctx.ExecuteQuery(); 

这里就是我想要的代码将其中一个列表添加到主页:

var pageUrl = "/sites/practice3/SitePages/Home.aspx"; 
var xml = ctx.Web.Lists.GetByTitle("News and Announcements").SchemaXml; 
var web = ctx.Web; 
var lists = web.Lists; 
ctx.Load(lists); 
ctx.ExecuteQuery(); 
AddWebPart(ctx, pageUrl, xml); 

这是方法AddWebPart,但是我还没有能够测试这是否会工作,因为我无法达到的代码:

public static void AddWebPart(ClientContext context, string pageUrl, string xml) 
    { 
     var page = context.Web.GetFileByServerRelativeUrl(pageUrl); 
     var webpartManager = page.GetLimitedWebPartManager(PersonalizationScope.Shared); 
     context.Load(webpartManager); 
     context.Load(webpartManager.WebParts); 
     context.ExecuteQuery(); 
     WebPartDefinition webpartDef = webpartManager.ImportWebPart(xml); 
     WebPartDefinition webpart = webpartManager.AddWebPart(webpartDef.WebPart, "mainContent", 0); 
     context.Load(webpartDef); 
     context.ExecuteQuery(); 
     //webpartManager.ImportWebPart(xml); 
     //context.ExecuteQuery(); 
     Console.WriteLine("Hit any key to continue..."); 
     Console.ReadKey(); 
     Console.ReadKey(); 
    } 

谢谢任何​​帮助!

您正在加载所有列表信息(包含基本文件),因此尝试访问XML数据时出现NonInitializedProperty异常。如果你想获得你的模式,你需要明确加载它。

var pageUrl = "/sites/practice3/SitePages/Home.aspx"; 
// mark object you would like to access 
var list = ctx.Web.Lists.GetByTitle("News and Announcements"); 
// prepare load query with SchemaXml property 
ctx.Load(list, l=>l.SchemaXml); 
ctx.ExecuteQuery(); // request the data 

AddWebPart(ctx, pageUrl, list.SchemaXml); 

希望有帮助。

+0

这解决了这个问题......谢谢!现在我在'AddWebPart'函数的一行中得到一个错误:'无法识别此Web部件的XML名称空间' 我不确定这是为什么,但如果您有任何想法非常有帮助! – Kyle

+0

这是因为您正在将'SchemaXML'列表传递给'webpartManager.ImportWebPart()'方法,而不是Web部件xml内容。如果您想要让您的Web部件发送正确的XML或过滤'webpartManager.WebParts'(不要忘记加载该属性)以获取您的Web部件。然后将其添加到页面。 – nizzik

+0

我想这是我的问题,因为我认为'SchemaXML'是我正在寻找的XML。 – Kyle