Как подключить Event Receiver к SPList программно?

Я работаю над проектом в SharePoint 2010, где у меня есть несколько сайтов. у каждого сайта есть список с новостями, и я хочу прикрепить к этим спискам Event Receiver.

Нижележащие сайты и списки создаются программно, но я не могу прикрепить приемник событий, который есть в моем решении 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\, \, версия \=1.0.1777.23493\, Culture\= нейтральный \, PublicKeyToken\=49c7547d535382ab'или одна из его зависимостей. Указанное имя сборки или кодовая база недопустимы. (Исключение из HRESULT: 0x80131047)

Спасибо за помощь.

3 ответа

Я заканчиваю тем, что создал метод Расширения Списка для этого:

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);

Пара вещей, на которые стоит посмотреть:

  1. Ваша версия сборки указана как 1.0.1777.23493. Похоже, что он автоматически увеличивается. Вы захотите установить фиксированную версию сборки, или она будет обновляться при каждой сборке, нарушая ваш код.
  2. Вы устанавливаете eventReceiver.Synchronization = SPEventReceiverSynchronization.Synchronous, но ItemAdded является асинхронным событием.
  3. Убедитесь, что ваша сборка приемника событий была развернута в GAC на сервере SharePoint, и что вы повторно использовали пулы приложений SharePoint в IIS, прежде чем запускать свой код.

Мне никогда не удавалось с этой версией eventReceivers.Add() ты используешь.

Вот я использую PowerShell Fraggent, он будет очень похож на C#

$ev = $currentList.EventReceivers.Add([Microsoft.SharePoint.SPEventReceiverType]::ItemAdded, $assemblyName, $className);
Другие вопросы по тегам