hat es jemand geschafft, ein Webpart mit CSOM in eine Wiki-Seite einzufügen?Wie fügt man ein Webpart zu einem SitePages/Home.aspx mit CSOM hinzu?
Hintergrund: Home.aspx ist eine Wiki-Seite und alle WPs befinden sich in der Rich-Text-Zone (in der Tat eine "WikiField" -Spalte). Technisch befinden sie sich in einer versteckten "wpz" -Webpartzone und zusätzlich gibt es immer einen Platzhalter mit WP's ID in der WikiField-Spalte.
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();
}
}
}
Alles funktioniert gut bis zur letzten item.Update() und clientContext.ExecuteQuery() werden aufgerufen:
Ich habe die vorhandenen serverseitigen Code auf http://blog.mastykarz.nl/programmatically-adding-web-parts-rich-content-sharepoint-2010/ und http://640kbisenough.com/2014/06/26/sharepoint-2013-moving-webparts-programmatically-to-rich-content-zone/ in diese gesehen modifiziert. Vor dem Update() wird der neue Platzhalter richtig in den WikiField-Inhalt eingefügt. Aber nach dem Update() kehrt der WikiField-Inhalt in seinen ursprünglichen Zustand (!) Zurück
Hinweis: Als Alternative kann der WP in eine andere Zone (zB "Bottom") eingefügt werden. In diesem Fall wird das WP auf der Seite angezeigt. Aber es hat zwei wesentliche Nachteile: Die neu erstellte Zone ist nicht gut formatiert und die WP kann nicht verschoben oder sogar gelöscht werden.
Danke für irgendeinen Eingang auf diesem.
Hallo Vadim, ich bin kein Experte bei der Veröffentlichung von fea tures aber die gewöhnliche Wiki-Seite (z. Der Inhaltstyp /SitePages/Home.aspx) enthält nicht das Feld "PublishingPageContent". Alles, was ich sehen kann, ist ein WikiField-Feld. Ihr Code konnte den Inhalt des WikiField leider nicht aktualisieren. Hättest du eine andere Idee? –
Ich habe das gleiche Problem wie Jan. Ich konnte das PublishingPageContent-Feld nicht bearbeiten. –
Wir haben dies funktioniert, indem wir 'PublishingPageContent' durch 'WikiField' ersetzt haben – dhendry