我可以在Sharepoint中以编程方式将一个Web部件替换为另一个Web部件吗

时间:2009-04-22 16:14:42

标签: sharepoint web-parts

我们有一个使用现成的内容编辑器webpart对内容进行了大量开发的sharepoint网站。在使用除IE之外的任何其他浏览器时,这有点垃圾。

我们考虑更新到免费的Telerik内容编辑器,但是我们希望自己保存大量的复制和粘贴,然后单击并选择交换Web部件。

似乎没有正式的升级路径,但在我看来,必须有可能使用代码(tm)的力量来获取原始webpart的内容,新建一个telerik webopart并将内容放入新的webpart ...然后删除旧的原始Web部件。

有没有人做过这种事情?如何布置代码并实际运行将进行交换的代码(如果可能的话)。一个带有“Do Swap”按钮的新webpart?还是更复杂的东西?

我还需要遍历每个页面和子网站(以及子网站中的页面)并查看每个Web部件。这样做有最佳实践方法吗?

谢谢,并且抱歉有点啰嗦!

2 个答案:

答案 0 :(得分:2)

我会为此编写一个控制台应用程序。

打开根网并遍历其子网。 通过打开WebPartManager,完成每个页面所需的工作。

这里有一些伪代码可以帮助你入门。

string SourceUrl = "http://ThisWeb";

using (SPSite sourceSite = new SPSite(SourceURL))
{
    using (SPWeb sourceWeb = sourceSite.OpenWeb(SourceURL))
    {
        IterateSubWebsProd(sourceWeb):
    }
}

private void IterateSubWebsProd(SPWeb sourceWeb)
{
    // This is the migration function
    DoThingyWithThisWeb(sourceWeb);

    foreach (SPWeb subWeb in sourceWeb.Webs)
    {
      IterateSubWebsProd(subWeb);
      subWeb.Dispose();
    }
}

private void DoThingyWithThisWeb(SPWeb sourceWeb)
{
    PublishingPage currentPage = null;

    string currentPageName = "<something>";
    // Find the pages that you want to modify, with a CAML query for example
    SPQuery query = new SPQuery();
    query.Query = string.Format("" +
    "<Where>" +
      "<Eq>" +
         "<FieldRef Name='FileLeafRef' />" +
         "<Value Type='File'>{0}</Value>" +
      "</Eq>" +
    "</Where>" +
    "", currentPageName);


     // This codesnippet is from a Publishing web example
     PublishingWeb publishingWeb = PublishingWeb.GetPublishingWeb(sourceWeb);
    PublishingPageCollection pageColl = publishingWeb.GetPublishingPages(query);
    if (pageColl.Count > 0)
    {
        currentPage = pageColl[0];
    }

    using (SPLimitedWebPartManager wpMan = currentPage.ListItem.File.GetLimitedWebPartManager(System.Web.UI.WebControls.WebParts.PersonalizationScope.Shared))
    {
        foreach (WebPart wp in wpMan.WebParts)
        {
            if (wp.GetType().Equals(typeof(Microsoft.SharePoint.WebPartPages.ContentEditorWebPart)))
            {
                Microsoft.SharePoint.WebPartPages.ContentEditorWebPart thisWebPart = wp as Microsoft.SharePoint.WebPartPages.ContentEditorWebPart;

                // This is just dummy code, here you will do your content migration 
                XmlDocument xmlDoc = new XmlDocument();
                XmlElement xmlElement = xmlDoc.CreateElement("RootElement");
                xmlElement.InnerText = sourceItem[SourceField].ToString();
                thisWebPart.Content = xmlElement;

                wpMan.SaveChanges(thisWebPart);
            }
        }
    }
}

答案 1 :(得分:1)

我对此并不是100%肯定,但如果您的内容作为单独的字段保存到列表中,您是否可以将Telerik控件指向保存内容的位置?这可能会导致Telerik控件在第一次编辑该内容时出现一些问题,但他们应该可以重新格式化内容并恢复。