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

Adding SharePoint list webpart to a Specific Page after Initial deployment with CSOM

在部署我的共享点网站期间,我创建了一些列表,我想以编程方式将其添加到主页,但找不到任何有效的列表。

现在,我收到以下错误:

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);

希望对您有所帮助。