gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 00:56:43 28 4
gpt4 key购买 nike

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

感谢您对此的任何意见。

最佳答案

以下示例演示如何将 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();
}

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

结果

enter image description here

关于sharepoint - 如何使用 CSOM 将 Web 部件添加到 SitePages/Home.aspx,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27268492/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com