Как подключить 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.0.1777.23493. Похоже, что он автоматически увеличивается. Вы захотите установить фиксированную версию сборки, или она будет обновляться при каждой сборке, нарушая ваш код.
- Вы устанавливаете eventReceiver.Synchronization = SPEventReceiverSynchronization.Synchronous, но ItemAdded является асинхронным событием.
- Убедитесь, что ваша сборка приемника событий была развернута в GAC на сервере SharePoint, и что вы повторно использовали пулы приложений SharePoint в IIS, прежде чем запускать свой код.
Мне никогда не удавалось с этой версией eventReceivers.Add()
ты используешь.
Вот я использую PowerShell Fraggent, он будет очень похож на C#
$ev = $currentList.EventReceivers.Add([Microsoft.SharePoint.SPEventReceiverType]::ItemAdded, $assemblyName, $className);