2010-04-13 45 views
1

与整个范围相比,这是一个非常小的行为,但是我想停下来。在每个功能激活/停用时重复添加功能元素

我已经创建了一个非常非常简单的SharePoint功能。它的清单中有两个元素:一个aspx webpart页面和一个元素xml。我将解释我的元素xml,它只是在下面添加一个模块。

<Elements xmlns="http://schemas.microsoft.com/sharepoint/"> 
    <Module Name="Pass" Url="" Path=""> 
     <File Url="pasq.aspx" NavBarHome="True" Type="Ghostable"> 
     <AllUsersWebPart WebPartZoneID="Left" WebPartOrder="0"> 
        <![CDATA[ 
        WARGH THIS PART DOESN'T MATTER FOR THIS QUESTION! 
        ]]> 
     </AllUsersWebPart> 
     </File> 
    </Module> 
</Elements> 

现在,我第一次部署和激活此功能,它工作正常。但是,如果我必须停用并重新激活该功能才能修复Web部件中的某些属性,那么我会在页面上找到第二个Web部件。当然,每个类似的周期只会增加越来越多。我知道必须创建一个新的Web部件才能使用我刚才所做的更改,但为什么旧Web部件仍然在页面上?作为功​​能激活/停用过程的一部分,我能否自动将这个较旧的Web部件自动消失,而无需使用Receiver类?

此基础上我已经使用的接收机solve this issue事实编辑 ,我结束了刚刚添加的WebPart去除作为特征失活的一部分。但我仍然希望,也许有一些我错过了。

回答

1

SharePoint不提供声明性方式(xml)以自动删除要素元素。您必须在特征接收器的FeatureDeactiving方法中添加一些代码,以编程方式将其删除,对不起。

+0

考虑到当某个功能被停用时,元素清单的其他部分(内容类型,字段类型,工作流程,自定义操作)不再存在,我希望它会保持一致。你的回答够了,谢谢你的帮助@ x0n – 2010-04-15 14:02:39

2

不幸的是,内容将被重复,除非你做下列操作之一:

解决方案1:您可以添加类似的代码来激活功能,在页面中添加的webpart如下:

SPFile file = page.File; 
using (SPLimitedWebPartManager WebPartManager = 
     file.GetLimitedWebPartManager(PersonalizationScope.Shared)) 
{ 
    try 
    { 
     SPLimitedWebPartCollection webparts = WebPartManager .WebParts; 
     if (webparts.Count == 0) 
     { 
      //set your web part 
      WebPartManager.AddWebPart(webpart, "MomoZone", 1); 
     } 
    } 
    catch(Exception ex) 
    { 
     throw; 
    } 
    finally 
    { 
     WebPartManager.Web.Dispose(); 
    } 
} 

解决方案2:您可以使用网站定义和只在网站创建后运行的Onet文件,这样在设置您的efatures隐藏时不会出现更多此问题

干杯