4

我正在开发一个项目 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\, \, Version\=1.0.1777.23493\, Culture\=neutral\, PublicKeyToken\=49c7547d535382ab' 或其依赖项之一。给定的程序集名称或代码库无效.(来自 HRESULT 的异常:0x80131047)”

感谢帮助。

4

3 回答 3

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);
于 2012-10-24T07:49:13.177 回答
2

你使用的这个版本我从来没有成功过eventReceivers.Add()

这是我正在使用的 powershell 框架,它在 C# 中非常相似

$ev = $currentList.EventReceivers.Add([Microsoft.SharePoint.SPEventReceiverType]::ItemAdded, $assemblyName, $className);
于 2012-05-22T14:34:12.667 回答
2

有几件事要看:

  1. 您的程序集版本列为 1.0.1777.23493。看起来它正在自动递增。您将需要设置一个固定的程序集版本,否则它将随着每次构建而更新,从而破坏您的代码。
  2. 您正在设置 eventReceiver.Synchronization = SPEventReceiverSynchronization.Synchronous,但 ItemAdded 是一个异步事件。
  3. 确保您的事件接收器程序集已部署到 SharePoint 服务器上的 GAC,并且在运行代码之前已在 IIS 中回收了 SharePoint 应用程序池。
于 2012-05-22T14:43:28.990 回答