2008-10-08 87 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); 
    } 
}