如何使用 CSOM 将 Web 部件添加到 SitePages/Home.aspx 中

2024-01-23

有人设法使用 CSOM 将 Web 部件添加到 Wiki 页面中吗?

背景:Home.aspx 是一个 Wiki 页面,其所有 WP 都位于富文本区域(实际上是“WikiField”列)。从技术上讲,它们位于隐藏的“wpz”Web 部件区域中,除此之外,WikiField 列中始终有一个带有 WP ID 的占位符。

我已经修改了现有的服务器端代码http://blog.mastykarz.nl/programmatically-adding-web-parts-rich-content-sharepoint-2010/ http://blog.mastykarz.nl/programmatically-adding-web-parts-rich-content-sharepoint-2010/ and http://640kbisenough.com/2014/06/26/sharepoint-2013-moving-webparts-programmatically-to-rich-content-zone/ http://640kbisenough.com/2014/06/26/sharepoint-2013-moving-webparts-programmatically-to-rich-content-zone/进入这个:

using System;
using Microsoft.SharePoint.Client;
using Microsoft.SharePoint.Client.WebParts;

public class Class1
{
    void DeployWebPart(ClientContext clientContext, string zone, string pattern, string position)
    {
        List library = clientContext.Web.GetList("/sites/site/SitePages/");
        clientContext.Load(library);
        clientContext.ExecuteQuery();
        CamlQuery query = CamlQuery.CreateAllItemsQuery(100);
        ListItemCollection itemColl = library.GetItems(query);
        clientContext.Load(itemColl, items => items.Include(i => i.Id, i => i.DisplayName, i => i["WikiField"]));
        clientContext.ExecuteQuery();
        ListItem item = itemColl.Where(i => i.DisplayName == "Home").First();
        clientContext.ExecuteQuery();
        File page = item.File;
        LimitedWebPartManager lwm = page.GetLimitedWebPartManager(PersonalizationScope.Shared);
        string xmlWebPart = @"<webParts>...</webParts>";
        WebPartDefinition wpd = lwm.ImportWebPart(xmlWebPart);
        WebPartDefinition realWpd = lwm.AddWebPart(wpd.WebPart, "wpz", 0);
        List targetList = clientContext.Web.GetList("/sites/site/Announcements/");
        clientContext.Load(targetList, l => l.Views);
        clientContext.Load(realWpd);
        clientContext.ExecuteQuery();
        string wpId = String.Format("g_{0}", realWpd.Id.ToString().Replace('-', '_'));
        if (zone == "wpz")
        {
            string htmlcontent = String.Format(CultureInfo.InvariantCulture, "<div class=\"ms-rtestate-read ms-rte-wpbox\" contenteditable=\"false\"><div class=\"ms-rtestate-notify  ms-rtestate-read {0}\" id=\"div_{0}\"></div><div id=\"vid_{0}\" style=\"display:none;\"></div></div>", new object[] { realWpd.Id.ToString("D") });
            string content = item["WikiField"] as string;
            System.Text.RegularExpressions.Regex regex = new System.Text.RegularExpressions.Regex(System.Text.RegularExpressions.Regex.Escape(pattern));
            if (position == "before")
            {
                content = regex.Replace(content, (htmlcontent + pattern), 1);
            }
            else
            {
                content = regex.Replace(content, (pattern + htmlcontent), 1);
            }
            item.Update();
            clientContext.ExecuteQuery();
        }
    }
}

一切正常,直到最后一个 item.Update() 和 clientContext.ExecuteQuery() 被调用。在 Update() 之前,新的占位符已正确插入到 WikiField 内容中。但是在 Update() 之后,WikiField 内容恢复到其原始状态(!)

注意:作为替代方案,可以将 WP 添加到另一个区域(例如“底部”)。在这种情况下,WP 将显示在页面上。但它有两个主要缺点:新创建的区域格式不佳,并且 WP 无法移动甚至删除。

感谢您对此的任何意见。


以下示例演示了如何将 Web 部件添加到 Enterprise Wiki 页面:

public static void AddWebPartIntoWikiPage(ClientContext context, string pageUrl, string webPartXml)
{
        var page = context.Web.GetFileByServerRelativeUrl(pageUrl);
        var webPartManager = page.GetLimitedWebPartManager(PersonalizationScope.Shared);

        var importedWebPart = webPartManager.ImportWebPart(webPartXml);
        var webPart = webPartManager.AddWebPart(importedWebPart.WebPart, "wpz", 0);
        context.Load(webPart);
        context.ExecuteQuery();

        string marker = String.Format(CultureInfo.InvariantCulture, "<div class=\"ms-rtestate-read ms-rte-wpbox\" contentEditable=\"false\"><div class=\"ms-rtestate-read {0}\" id=\"div_{0}\"></div><div style='display:none' id=\"vid_{0}\"></div></div>", webPart.Id);
        ListItem item = page.ListItemAllFields;
        context.Load(item);
        context.ExecuteQuery();
        item["PublishingPageContent"] = marker; 
        item.Update();
        context.ExecuteQuery();
}

Usage

var webPartXml = System.IO.File.ReadAllText(filePath);
using (var ctx = new ClientContext(webUri))
{
    AddWebPartIntoWikiPage(ctx, wikiPageUrl,webPartXml);
}

Result

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 CSOM 将 Web 部件添加到 SitePages/Home.aspx 中 的相关文章

随机推荐