【问题标题】:How to add a Web Part into a SitePages/Home.aspx using CSOM如何使用 CSOM 将 Web 部件添加到 SitePages/Home.aspx
【发布时间】:2014-12-05 06:44:07
【问题描述】:

是否有人设法使用 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://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无法移动甚至删除。

感谢您对此的任何意见。

【问题讨论】:

    标签: sharepoint csom


    【解决方案1】:

    以下示例演示如何将 Web 部件添加到企业 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();
    }
    

    用法

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

    结果

    【讨论】:

    • 您好 Vadim,我不是发布功能方面的专家,但普通的 Wiki 页面(例如 /SitePages/Home.aspx)内容类型没有 PublishingPageContent 字段。我只能看到一个 WikiField 字段。很遗憾,您的代码无法更新 WikiField 的内容。您还有其他想法吗?
    • 我遇到了与 Jan 相同的问题。我无法编辑 PublishingPageContent 字段。
    • 我们可以通过将 'PublishingPageContent' 替换为 'WikiField'
    猜你喜欢
    • 2021-10-08
    • 2017-12-30
    • 2013-09-24
    • 2018-02-13
    • 2020-08-10
    • 2011-06-11
    • 2010-09-19
    • 2010-11-02
    • 2010-12-25
    相关资源
    最近更新 更多