2008-10-08 50 views

回答

7

版本控制不是在站点级完成,而是在列表级完成。

如果你想版本是打开每一个新的图书馆,你就必须要么:

  • 使用自己的模板库(带版本开启)
  • 使用功能+事件处理程序以编程方式激活每个新列表的版本号

最简单的方法可能是使用自己的模板。为此,创建一个新的文档库,激活版本控制,然后将该列表保存为模板。

当您创建新列表时,您将能够使用您的模板并直接创建激活版本控制的列表。

+0

创建模板作为解决方案非常简单。 – CodeGrue 2012-10-05 19:02:07

5

你当然可以创建自己的网站定义,但这可能不是最好的解决方案。创建自定义库模板也会起作用,但是如果您想为特定网站定义为您创建的库打开版本控制功能,则必须提供其他内容。

我们恰好​​为我们的SharePoint实施做了这些工作。我们决定最好的方法是创建一个事件处理函数,并将其装订到所有网站,以便在创建网站时,对所有现有文档库进行版本控制。当然,新的文档库将获得创建它的用户设置的任何版本控制选项。

我们遇到的问题是没有“ListCreating”事件处理程序,因此我们无法在此时开启版本控制。因此,我们尝试将代码放入FeatureActivated事件处理程序中,并确定它会在网站创建时激活,然后可以更改所有文档库以启用版本控制。问题在于这个事件在图书馆真正创建之前被解雇了。

因此,我们决定将代码放入“ItemAdding”事件处理程序中,并在第一次运行后将其删除。因此,当用户第一次添加列表项或文档时,它将打开网站中所有文档库的版本控制。这样,我们确保用户无法在未经版本化的情况下将文档添加到现有库。此外,在添加项目之前创建的任何库都将默认打开版本控制。

这是一个多毛的解决方案,但它为我们工作得很好。以下是我们使用的代码:

public class SetVersioning : SPItemEventReceiver 
{ 
    public override void ItemAdding(SPItemEventProperties properties) 
    { 
     SPWeb CurrentWeb = properties.OpenWeb(); 
     foreach (SPDocumentLibrary doclib in CurrentWeb.GetListsOfType(SPBaseType.DocumentLibrary)) 
     { 
      doclib.EnableVersioning = true; 
      doclib.MajorVersionLimit = 8; 
      //doclib.EnableMinorVersions = true; 
      doclib.Update(); 
     } 
     //now get rid of the receiver 
     SPEventReceiverDefinitionCollection receivers = CurrentWeb.EventReceivers; 
     foreach (SPEventReceiverDefinition definition in receivers) 
     { 
      if (definition.Name.Equals(EVENT_RECEIVER_NAME)) 
      { 
       definition.Delete(); 
       break; 
      } 
     } 

     base.ItemAdding(properties); 
    } 
}