2014-12-03 17 views
5

có ai quản lý để thêm một phần Web vào một trang Wiki bằng cách sử dụng CSOM?Làm thế nào để thêm một phần Web vào một SitePages/Home.aspx bằng cách sử dụng CSOM

Nền: Home.aspx là trang Wiki và tất cả các WP của trang nằm trong vùng văn bản phong phú (trên thực tế là cột "WikiField"). Về mặt kỹ thuật, chúng nằm trong khu vực web "wpz" ẩn và ngoài ra, luôn có một trình giữ chỗ có ID của WP trong cột WikiField.

Tôi đã sửa đổi mã server-side hiện thấy trên 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/ vào đây:

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

Tất cả mọi thứ hoạt động tốt cho đến khi cuối cùng item.Update() và clientContext.ExecuteQuery() được gọi. Trước Update(), trình giữ chỗ mới được chèn đúng vào nội dung WikiField. Nhưng sau khi Update() nội dung của WikiField quay lại trạng thái ban đầu của nó (!)

Lưu ý: Thay vào đó, bạn có thể thêm WP vào vùng khác (ví dụ "Bottom"). Trong trường hợp này, WP sẽ được hiển thị trên trang. Nhưng nó có hai nhược điểm chính: Vùng mới được tạo ra không được định dạng tốt và WP không thể được di chuyển hoặc thậm chí bị xóa.

Cảm ơn mọi đầu vào về điều này.

Trả lời

3

Ví dụ sau minh họa cách thêm phần web vào Enterprise Wiki page:

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

Cách sử dụng

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

quả

enter image description here

+1

Hi Vadim, tôi không phải là chuyên gia xuất bản fea tures nhưng trang Wiki thông thường (ví dụ: /SitePages/Home.aspx) loại nội dung không có trường PublishingPageContent. Tất cả những gì tôi có thể thấy là một lĩnh vực WikiField. Mã của bạn không thể cập nhật nội dung của WikiField, thật không may. Bạn có ý tưởng nào khác không? –

+0

Tôi gặp vấn đề tương tự như tháng 1, tôi không thể chỉnh sửa trường PublishingPageContent. –

+3

Chúng tôi đã làm việc này, bằng cách thay thế 'PublishingPageContent' bằng 'WikiField' – dhendry

Các vấn đề liên quan