更改自定义列表模板时更新列表

时间:2011-01-10 10:53:55

标签: sharepoint sharepoint-2007 publishing wspbuilder

我在Visual Studio中为MOSS创建了一个功能,一个发布网站 - 此功能包含一些自定义列表模板和一些使用模板定义的列表。现在我需要更新列表模板,这不是问题,因为它只是向我的schema.xml添加几行,但我还需要一种方法来反映现有列表的更新。

据我所知,此功能不是标准的Sharepoint,但我如何以编程方式解决此问题,例如在我的OnActivated中,循环浏览我的列表并根据列表模板更新(删除/添加)字段?

1 个答案:

答案 0 :(得分:0)

是的,当您更新列表架构时,它不会反映在已创建的列表中。为此,在架构中添加FeatureActivated事件处理程序。每当您激活您的功能时,此事件处理程序都将运行代码。

在功能中创建一个XML配置文件,其中包含已创建的列表名称。然后,代码将读取XML文件并更新已创建的列表。

为了扩展性和灵活性,请注意此代码需要尽可能具有防御性。例如,当您再次在以后的某个时间再次激活该功能时,它不应再次进行更改,从而导致更改丢失或重复。它应首先检查,然后才进行更改。

相同的方案可用于内容类型。如果需要,我可以为您发布代码段。

 public override void FeatureActivated(SPFeatureReceiverProperties properties)
    {
        try
        {
            // Fix the Article Date column
            if (properties != null)
            {
                FixArticleDate(properties);
            }

            // Fix Metadata Tagging site columns by setting CustomField "MetadataType" to the Default value set in the field definition manifest file.
            if (properties != null && properties.Feature.Properties["FixMetadataTagging"] != null)
            {
                RepairMetadataTaggingSiteColumns(properties);
            }

            // Fix Lookup site columns by retrieving lookup list GUID from List="url". 
            if (properties != null && properties.Feature.Properties["FixListTagging"] != null)
            {
                RepairListTaggingSiteColumns(properties);
            }

            // Fixing Site Columns
            if (properties != null && properties.Feature.Properties["FixSiteColumns"] != null)
            {
                RepairSiteColumns(properties);
            }
        }
        catch (SPException sharepointEx)
        {
            ExceptionManager.LogError(ULSTracerCategoriesEnum.FeatureReceivers, sharepointEx);
        }
    }

XML:

<?xml version="1.0" encoding="utf-8" ?>
<Feature Id="A23990CF-C35D-4771-BF5A-916C304C9EF9"
   Title="Content Types"
   Description="This Feature Creates all the Required Content Types and site columns"
   Version="1.0.0.0" Scope="Site" Hidden="FALSE"
   ReceiverAssembly="xxxx, Version=1.0.0.0, Culture=neutral, PublicKeyToken=86597c5d57921943"
   ReceiverClass="xxxx.SharePoint.UI.Core.FeatureReceivers.CoreFeatureReceiver"        
   xmlns="http://schemas.microsoft.com/sharepoint/">
  <ElementManifests>
    <ElementManifest Location="SiteColumns\SiteColumns.xml" />
    <ElementManifest Location="ContentTypes\ContentTypes.xml" />
  </ElementManifests>
  <Properties>
    <Property Key="FixMetadataTagging" Value="SiteColumns\MetadataTaggingSiteColumnsManifest.xml"/>
    <Property Key="FixListTagging" Value="SiteColumns\ListTaggingSiteColumnsManifest.xml"/>
    <Property Key="FixSiteColumns" Value="ContentTypeFixes\SiteColumnAdditions.xml"/>
  </Properties>
</Feature>