2014-12-03 1 views
5

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.

Antwort

3

Das folgende Beispiel zeigt, wie Webpart in Enterprise Wiki Seite hinzufügen:

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

Nutzungs

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

Ergebnis

enter image description here

+1

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? –

+0

Ich habe das gleiche Problem wie Jan. Ich konnte das PublishingPageContent-Feld nicht bearbeiten. –

+3

Wir haben dies funktioniert, indem wir 'PublishingPageContent' durch 'WikiField' ersetzt haben – dhendry

Verwandte Themen