我正在做一个项目 i SharePoint 2010,其中我有几个网站。 每个站点下都包含一个包含新闻的列表,我想将事件接收器附加到这些列表中。
下面的站点和列表是以编程方式创建的,但我无法附加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\, 区域性\=中性\, 公钥令牌\=49c7547d535382ab' 或其依赖项之一。给定的程序集名称或代码库无效。(HRESULT的例外:0x80131047(">
感谢您的帮助。
我最终为此创建了一个列表扩展方法:
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);
我从来没有成功过你正在使用的这个版本的eventReceivers.Add()
。
这是我正在使用的Powershell,它在C#中非常相似
$ev = $currentList.EventReceivers.Add([Microsoft.SharePoint.SPEventReceiverType]::ItemAdded, $assemblyName, $className);
要看的几件事:
- 您的程序集版本列为 1.0.1777.23493。这看起来像是自动递增的。您将需要设置一个固定的程序集版本,否则它将随着每次构建而更新,从而破坏您的代码。
- 您正在设置 eventReceiver.Sync = SPEventReceiverSynchronization.Sync,但 ItemAdd 是一个异步事件。
- 在运行代码之前,请确保您的事件接收器程序集已部署到 SharePoint 服务器上的 GAC,并且已在 IIS 中回收了 SharePoint 应用程序池。