Sharepoint 每次功能激活/停用时重复添加的功能元素

Sharepoint 每次功能激活/停用时重复添加的功能元素,sharepoint,moss,schema,web-parts,Sharepoint,Moss,Schema,Web Parts,与整个范围相比,这是一个非常小的行为,但我想阻止它 我创建了一个非常简单的SharePoint功能。它的清单中有两个元素:一个ASPXWebPart页面和一个xml元素。下面我将解释我的元素xml,它只是添加了一个模块 <Elements xmlns="http://schemas.microsoft.com/sharepoint/"> <Module Name="Pass" Url="" Path=""> <File Url="pasq.as

与整个范围相比,这是一个非常小的行为,但我想阻止它

我创建了一个非常简单的SharePoint功能。它的清单中有两个元素:一个ASPXWebPart页面和一个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部件删除作为功能停用的一部分。但我仍然希望我遗漏了一些东西。

SharePoint没有提供声明式方式(xml)来自动删除功能元素。您必须在feature receiver上的FeatureDeactiving方法中添加一些代码,才能以编程方式将其删除,抱歉。

很遗憾,除非您执行以下操作之一,否则内容将重复:

解决方案1:您可以向“激活”功能添加类似的代码,以便在页面中添加Web部件,如下所示:

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文件一起使用,这样在将EFARES设置为hidden时就不会再出现此问题


干杯

考虑到当某个功能被停用时,元素清单的其他部分(内容类型、字段类型、工作流、自定义操作)将停止,我希望它是一致的。您的回答就足够了,谢谢您的帮助@x0n