2012-05-22 49 views
4

我正在處理一個項目,我在SharePoint 2010中有幾個站點。每個站點下都包含一個包含新聞的列表,並且我希望將一個事件接收器附加到這些列表。如何以編程方式將Event Receiver附加到SPList?

下面的站點和列表是以編程方式創建的,但我無法附加我在VS2010解決方案中使用的事件接收器。

我試過這個:

SPList list = new SPSite(siteURL).OpenWeb().Lists[listName]; 
SPEventReceiverDefinitionCollection eventReceivers = list.EventReceivers; 

SPEventReceiverDefinition eventReceiver = eventReceivers.Add(); 
eventReceiver.Name = receiverName; 
eventReceiver.Synchronization = SPEventReceiverSynchronization.Synchronous; 
eventReceiver.Type = SPEventReceiverType.ItemAdded; 
eventReceiver.SequenceNumber = sequenceNumber; 
eventReceiver.Assembly = assemblyFullName; 
eventReceiver.Class = assemblyClassName; 
eventReceiver.Data = receiverData; 

eventReceiver.Update(); 

但它不工作。

錯誤消息是「無法加載文件或程序集'Projekt_Test1 \,\,Version \ = 1.0.1777.23493 \,Culture \ = neutral \,PublicKeyToken \ = 49c7547d535382ab'或其某個依賴項。或代碼庫無效。(來自HRESULT的例外:0x80131047)「

感謝您的幫助。

回答

2

我從來沒有成功使用這個版本的eventReceivers.Add()您正在使用。

這裏是我使用PowerShell的framgent,它會在C#非常相似

$ev = $currentList.EventReceivers.Add([Microsoft.SharePoint.SPEventReceiverType]::ItemAdded, $assemblyName, $className); 
2

的東西夫婦看:

  1. 您的裝配版本被列爲1.0.1777.23493 。看起來它正在自動遞增。您將需要設置一個固定的程序集版本,或者每次構建都會更新,從而破壞您的代碼。
  2. 您正在設置eventReceiver.Synchronization = SPEventReceiverSynchronization.Synchronous,但ItemAdded是一個異步事件。
  3. 確保您的事件接收器程序集已部署到SharePoint服務器上的GAC,並且您已在IIS中回收SharePoint應用程序池,然後再運行代碼。
8

我結束了創建這個列表擴展方法:

public static void EnsureEventReceiver(this SPList list,IEnumerable<SPEventReceiverType> receiverTypes, Type eventHander, SPEventReceiverSynchronization synchronization, int sequenceNumber) 
{ 
    foreach (SPEventReceiverType spEventReceiverType in receiverTypes) 
    { 
     string name = list.Title + spEventReceiverType.ToString(); 

     if (list.EventReceivers.Cast<SPEventReceiverDefinition>().All(i => i.Name != name)) 
     { 
      SPEventReceiverDefinition eventReceiver = list.EventReceivers.Add(); 
      eventReceiver.Name = name; 
      eventReceiver.Type = spEventReceiverType; 
      eventReceiver.Assembly = eventHander.Assembly.FullName; 
      eventReceiver.Class = eventHander.FullName; 
      eventReceiver.SequenceNumber = sequenceNumber; 
      eventReceiver.Synchronization = synchronization; 
      eventReceiver.Update(); 
     } 
    }  
} 

注意事項,這種方法的侷限性:

  • 只有一個每列表事件,因爲這是我不夠好,如果你需要更多,那麼你需要通過名稱作爲參數
  • 事件處理程序方法在同一類

您可以使用它像這樣:

list.EnsureEventReceiver(
    new[] { SPEventReceiverType.ItemAdded, SPEventReceiverType.ItemUpdated }, 
    typeof(NewsItemsHandler), 
    SPEventReceiverSynchronization.Synchronous, 
    10000); 
+0

真棒,謝謝了一堆。 –

相關問題