public static void AddWebPartToWikiPage(this Web web, string serverRelativePageUrl, WebPartEntity webPart, int row, int col, bool addSpace) { if (string.IsNullOrEmpty(serverRelativePageUrl)) { throw (serverRelativePageUrl == null) ? new ArgumentNullException("serverRelativePageUrl") : new ArgumentException(CoreResources.Exception_Message_EmptyString_Arg, "serverRelativePageUrl"); } if (webPart == null) { throw new ArgumentNullException("webPart"); } File webPartPage = web.GetFileByServerRelativeUrl(serverRelativePageUrl); if (webPartPage == null) { return; } web.Context.Load(webPartPage); web.Context.Load(webPartPage.ListItemAllFields); web.Context.ExecuteQuery(); string wikiField = (string)webPartPage.ListItemAllFields["WikiField"]; LimitedWebPartManager limitedWebPartManager = webPartPage.GetLimitedWebPartManager(PersonalizationScope.Shared); WebPartDefinition oWebPartDefinition = limitedWebPartManager.ImportWebPart(webPart.WebPartXml); WebPartDefinition wpdNew = limitedWebPartManager.AddWebPart(oWebPartDefinition.WebPart, "wpz", 0); web.Context.Load(wpdNew); web.Context.ExecuteQuery(); //HTML structure in default team site home page (W16) //<div class="ExternalClass284FC748CB4242F6808DE69314A7C981"> // <div class="ExternalClass5B1565E02FCA4F22A89640AC10DB16F3"> // <table id="layoutsTable" style="width:100%;"> // <tbody> // <tr style="vertical-align:top;"> // <td colspan="2"> // <div class="ms-rte-layoutszone-outer" style="width:100%;"> // <div class="ms-rte-layoutszone-inner" style="word-wrap:break-word;margin:0px;border:0px;"> // <div><span><span><div class="ms-rtestate-read ms-rte-wpbox"><div class="ms-rtestate-read 9ed0c0ac-54d0-4460-9f1c-7e98655b0847" id="div_9ed0c0ac-54d0-4460-9f1c-7e98655b0847"></div><div class="ms-rtestate-read" id="vid_9ed0c0ac-54d0-4460-9f1c-7e98655b0847" style="display:none;"></div></div></span></span><p> </p></div> // <div class="ms-rtestate-read ms-rte-wpbox"> // <div class="ms-rtestate-read c7a1f9a9-4e27-4aa3-878b-c8c6c87961c0" id="div_c7a1f9a9-4e27-4aa3-878b-c8c6c87961c0"></div> // <div class="ms-rtestate-read" id="vid_c7a1f9a9-4e27-4aa3-878b-c8c6c87961c0" style="display:none;"></div> // </div> // </div> // </div> // </td> // </tr> // <tr style="vertical-align:top;"> // <td style="width:49.95%;"> // <div class="ms-rte-layoutszone-outer" style="width:100%;"> // <div class="ms-rte-layoutszone-inner" style="word-wrap:break-word;margin:0px;border:0px;"> // <div class="ms-rtestate-read ms-rte-wpbox"> // <div class="ms-rtestate-read b55b18a3-8a3b-453f-a714-7e8d803f4d30" id="div_b55b18a3-8a3b-453f-a714-7e8d803f4d30"></div> // <div class="ms-rtestate-read" id="vid_b55b18a3-8a3b-453f-a714-7e8d803f4d30" style="display:none;"></div> // </div> // </div> // </div> // </td> // <td class="ms-wiki-columnSpacing" style="width:49.95%;"> // <div class="ms-rte-layoutszone-outer" style="width:100%;"> // <div class="ms-rte-layoutszone-inner" style="word-wrap:break-word;margin:0px;border:0px;"> // <div class="ms-rtestate-read ms-rte-wpbox"> // <div class="ms-rtestate-read 0b2f12a4-3ab5-4a59-b2eb-275bbc617f95" id="div_0b2f12a4-3ab5-4a59-b2eb-275bbc617f95"></div> // <div class="ms-rtestate-read" id="vid_0b2f12a4-3ab5-4a59-b2eb-275bbc617f95" style="display:none;"></div> // </div> // </div> // </div> // </td> // </tr> // </tbody> // </table> // <span id="layoutsData" style="display:none;">true,false,2</span> // </div> //</div> XmlDocument xd = new XmlDocument(); xd.PreserveWhitespace = true; xd.LoadXml(wikiField); // Sometimes the wikifield content seems to be surrounded by an additional div? XmlElement layoutsTable = xd.SelectSingleNode("div/div/table") as XmlElement; if (layoutsTable == null) { layoutsTable = xd.SelectSingleNode("div/table") as XmlElement; } XmlElement layoutsZoneInner = layoutsTable.SelectSingleNode(string.Format("tbody/tr[{0}]/td[{1}]/div/div", row, col)) as XmlElement; // - space element XmlElement space = xd.CreateElement("p"); XmlText text = xd.CreateTextNode(" "); space.AppendChild(text); // - wpBoxDiv XmlElement wpBoxDiv = xd.CreateElement("div"); layoutsZoneInner.AppendChild(wpBoxDiv); if (addSpace) { layoutsZoneInner.AppendChild(space); } XmlAttribute attribute = xd.CreateAttribute("class"); wpBoxDiv.Attributes.Append(attribute); attribute.Value = "ms-rtestate-read ms-rte-wpbox"; attribute = xd.CreateAttribute("contentEditable"); wpBoxDiv.Attributes.Append(attribute); attribute.Value = "false"; // - div1 XmlElement div1 = xd.CreateElement("div"); wpBoxDiv.AppendChild(div1); div1.IsEmpty = false; attribute = xd.CreateAttribute("class"); div1.Attributes.Append(attribute); attribute.Value = "ms-rtestate-read " + wpdNew.Id.ToString("D"); attribute = xd.CreateAttribute("id"); div1.Attributes.Append(attribute); attribute.Value = "div_" + wpdNew.Id.ToString("D"); // - div2 XmlElement div2 = xd.CreateElement("div"); wpBoxDiv.AppendChild(div2); div2.IsEmpty = false; attribute = xd.CreateAttribute("style"); div2.Attributes.Append(attribute); attribute.Value = "display:none"; attribute = xd.CreateAttribute("id"); div2.Attributes.Append(attribute); attribute.Value = "vid_" + wpdNew.Id.ToString("D"); ListItem listItem = webPartPage.ListItemAllFields; listItem["WikiField"] = xd.OuterXml; listItem.Update(); web.Context.ExecuteQuery(); }
/// <summary> /// Inserts a web part on a web part page /// </summary> /// <param name="web">Site to be processed - can be root web or sub site</param> /// <param name="serverRelativePageUrl">Page to add the web part on</param> /// <param name="webPart">Information about the web part to insert</param> /// <exception cref="System.ArgumentException">Thrown when serverRelativePageUrl is a zero-length string or contains only white space</exception> /// <exception cref="System.ArgumentNullException">Thrown when serverRelativePageUrl or webPart is null</exception> public static void AddWebPartToWebPartPage(this Web web, string serverRelativePageUrl, WebPartEntity webPart) { if (string.IsNullOrEmpty(serverRelativePageUrl)) { throw (serverRelativePageUrl == null) ? new ArgumentNullException("serverRelativePageUrl") : new ArgumentException(CoreResources.Exception_Message_EmptyString_Arg, "serverRelativePageUrl"); } if (webPart == null) { throw new ArgumentNullException("webPart"); } var webPartPage = web.GetFileByServerRelativeUrl(serverRelativePageUrl); if (webPartPage == null) { return; } web.Context.Load(webPartPage); web.Context.ExecuteQuery(); LimitedWebPartManager limitedWebPartManager = webPartPage.GetLimitedWebPartManager(PersonalizationScope.Shared); WebPartDefinition oWebPartDefinition = limitedWebPartManager.ImportWebPart(webPart.WebPartXml); limitedWebPartManager.AddWebPart(oWebPartDefinition.WebPart, webPart.WebPartZone, webPart.WebPartIndex); web.Context.ExecuteQuery(); }
/// <summary> /// Add web part to a wiki style page /// </summary> /// <param name="web">Site to be processed - can be root web or sub site</param> /// <param name="folder">System name of the wiki page library - typically sitepages</param> /// <param name="webPart">Information about the web part to insert</param> /// <param name="page">Page to add the web part on</param> /// <param name="row">Row of the wiki table that should hold the inserted web part</param> /// <param name="col">Column of the wiki table that should hold the inserted web part</param> /// <param name="addSpace">Does a blank line need to be added after the web part (to space web parts)</param> /// <exception cref="System.ArgumentException">Thrown when folder or page is a zero-length string or contains only white space</exception> /// <exception cref="System.ArgumentNullException">Thrown when folder, webPart or page is null</exception> public static void AddWebPartToWikiPage(this Web web, string folder, WebPartEntity webPart, string page, int row, int col, bool addSpace) { if (string.IsNullOrEmpty(folder)) { throw (folder == null) ? new ArgumentNullException("folder") : new ArgumentException(CoreResources.Exception_Message_EmptyString_Arg, "folder"); } if (webPart == null) { throw new ArgumentNullException("webPart"); } if (string.IsNullOrEmpty(page)) { throw (page == null) ? new ArgumentNullException("page") : new ArgumentException(CoreResources.Exception_Message_EmptyString_Arg, "page"); } if (!web.IsObjectPropertyInstantiated("ServerRelativeUrl")) { web.Context.Load(web, w => w.ServerRelativeUrl); web.Context.ExecuteQuery(); } var webServerRelativeUrl = UrlUtility.EnsureTrailingSlash(web.ServerRelativeUrl); var serverRelativeUrl = UrlUtility.Combine(folder, page); AddWebPartToWikiPage(web, webServerRelativeUrl + serverRelativeUrl, webPart, row, col, addSpace); }
/// <summary> /// Inserts a web part on a web part page /// </summary> /// <param name="web">Site to be processed - can be root web or sub site</param> /// <param name="webPart">Information about the web part to insert</param> /// <param name="page">Page to add the web part on</param> /// <exception cref="System.ArgumentException">Thrown when page is a zero-length string or contains only white space</exception> /// <exception cref="System.ArgumentNullException">Thrown when webPart or page is null</exception> public static void AddWebPartToWebPartPage(this Web web, WebPartEntity webPart, string page) { if (webPart == null) { throw new ArgumentNullException("webPart"); } if (string.IsNullOrEmpty(page)) { throw (page == null) ? new ArgumentNullException("page") : new ArgumentException(CoreResources.Exception_Message_EmptyString_Arg, "page"); } if (!web.IsObjectPropertyInstantiated("ServerRelativeUrl")) { web.Context.Load(web, w => w.ServerRelativeUrl); web.Context.ExecuteQuery(); } var serverRelativeUrl = UrlUtility.Combine(web.ServerRelativeUrl, page); AddWebPartToWebPartPage(web, serverRelativeUrl, webPart); }