2011-04-13 50 views
4

我將配置發佈頁面作爲功能的一部分,並在頁面上放置單個列表視圖Web部件(請參閱下面的代碼)。這一切都很完美。SharePoint 2010:重新部署功能會將重複的Web部件添加到頁面

<Elements> 
    <Module> 
     <File Path="default.aspx" Url="BulletinBoard.aspx" Type="GhostableInLibrary" IgnoreIfAlreadyExists="TRUE"> 
      <Property Name="Title" Value="Bulletin Board" /> 
      <Property Name="PublishingPageLayout" Value="~SiteCollection/_catalogs/masterpage/ListNewsletterStyle.aspx" /> 
      <Property Name="ContentType" Value="Page" /> 
      <Property Name="PublishingPageImage" Value="" /> 
      <View List="Lists/BulletinBoard" BaseViewID="2" WebPartZoneID="Main" WebPartOrder="1"> 
       <![CDATA[ 
       <webParts> 
        <webPart xmlns="http://schemas.microsoft.com/WebPart/v3"> 
         <metaData> 
          <type name="Microsoft.SharePoint.WebPartPages.XsltListViewWebPart,Microsoft.SharePoint,Version=14.0.0.0,Culture=neutral,PublicKeyToken=71e9bce111e9429c" /> 
          <importErrorMessage>Cannot import this Web Part.</importErrorMessage> 
         </metaData> 
         <data> 
          <properties> 
           <property name="Title">Active Announcements</property> 
           <property name="ChromeType">None</property> 
          </properties> 
         </data> 
        </webPart> 
       </webParts> 
       ]]> 
      </View> 
     </File> 
    </Module> 
</Elements> 

唯一的問題是,每一個我通過Visual Studio重新部署我的功能時,列表視圖Web部件被複制(即一個又一個被添加到Web部件區域)。

這個問題只有出現影響網絡零件與<查看... >標記。配置了< AllUsersWebPart ... >標籤的Web部件不會被複制。

我該如何預防?

回答

3

您可以添加一個功能接收器並添加webpart,如果它不存在而不是添加XML中的webpart。 標籤是什麼意思?

+0

感謝您的建議Anita。誠然,爲了一致性,我希望能夠在同一個地方(通過XML特性)提供我所有的頁面和Web部件,但是我可以使用特性接收器檢查是否有重複項,並在必要時刪除它們。至於「標記」引用,StackOverFlow在我的文章中沒有包含我的HTML標記,請參閱上面的更新。 – 2011-04-14 08:39:44

1

查看這個blog entry來自Waldek Mastykarz。它有下面的C#代碼,應該類似於你正在尋找的。

using (SPSite site = new SPSite("http://sharepoint")) 
{ 
    SPList list = site.GetCatalog(SPListTemplateType.MasterPageCatalog); 
    SPListItemCollection items = list.Items; 
    List<string> webParts = new List<string>(); 

    // find the right Page Layout 
    foreach (SPListItem item in items) 
    { 
    if (item.Name.Equals("CustomPageLayout.aspx", 
     StringComparison.CurrentCultureIgnoreCase)) 
    { 
     SPFile file = item.File; 
     // get the Web Part Manager for the Page Layout 
     SPLimitedWebPartManager wpm = 
     file.GetLimitedWebPartManager(PersonalizationScope.Shared); 
     // iterate through all Web Parts and remove duplicates 
     while (wpm.WebParts.Count > 0) 
     { 
     StringBuilder sb = new StringBuilder(); 
     XmlWriterSettings xws = new XmlWriterSettings(); 
     xws.OmitXmlDeclaration = true; 
     XmlWriter xw = XmlWriter.Create(sb, xws); 
     System.Web.UI.WebControls.WebParts.WebPart wp = 
      wpm.WebParts[0]; 
     wpm.ExportWebPart(wp, xw); 
     xw.Flush(); 
     string md5Hash = getMd5Hash(sb.ToString()); 
     if (webParts.Contains(md5Hash)) 
      wpm.DeleteWebPart(wp); 
     else 
      webParts.Add(md5Hash); 
     } 
    } 
    } 
} 
+0

在我的特殊情況下,我使用了一個功能接收器來刪除停用時功能提供的Web部件。當功能重新激活時(例如在開發過程中從Visual Studio重新部署時),這爲新Web部件「清除了」。我發現了一些很棒的Linq代碼,它分析了該功能的清單,並刪除了所有隻配置了它的Web部件實例,因此沒有硬編碼的頁面佈局名稱等。由於我的Web部件不是個性化的,因此沒有用戶的更改/刪除Web部件時會丟失的設置。 – 2012-02-16 02:48:54

+0

你有沒有一個linke的代碼呢?我在功能接收器中運行類似於上面代碼的代碼,但是您的解決方案聽起來更完整。 – skeletank 2012-02-16 14:04:04

+0

[更新]這是我使用的博客文章:http://platinumdogs.wordpress.com/2009/08/10/removing-provisioned-files-from-sharepoint-during-feature-deactivation/ – 2012-02-20 08:34:19

0

SharePoint 2013用戶注意事項。您應該將ReplaceContent = True添加到標籤。重複的webpart問題將被解決。

相關問題