将 1 个事件接收器与 2 个文档库相关联

associate 1 event receiver with 2 document libraries

我有一个项目更新事件接收器,我只想将其与 2 个文档库相关联。

之前我将事件接收器与 ListTemplateId="101" 相关联。所以这个事件接收器正在为所有文档库触发!这是我不想要的,但我无法完全避免。因此,作为第一行代码中的解决方法,我检查了调用事件接收器的库,如果不是预期的库则返回。

然后我在elements.xml中阅读了一些关于receivers标签的内容,发现我可以在[中注册多个receivers标签=33=]。所以我改变了 elements.xml 如下

<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
  <Receivers ListUrl="DocLib1">
    <Receiver>
      <Name>EventReceiver1ItemAdded</Name>
      <Type>ItemAdded</Type>
      <Assembly>$SharePoint.Project.AssemblyFullName$</Assembly>
      <Class>NM1.EventReceiver1.EventReceiver1</Class>
      <SequenceNumber>10000</SequenceNumber>
      <Synchronization>Synchronous</Synchronization>
    </Receiver>
  </Receivers>
  <Receivers ListUrl="DocLib2">
    <Receiver>
      <Name>EventReceiver1ItemAdded</Name>
      <Type>ItemAdded</Type>
      <Assembly>$SharePoint.Project.AssemblyFullName$</Assembly>
      <Class>NM1.EventReceiver1.EventReceiver1</Class>
      <SequenceNumber>10000</SequenceNumber>
      <Synchronization>Synchronous</Synchronization>
    </Receiver>
  </Receivers>
</Elements>

希望事件接收器仅与这 2 个文档库相关联。但事实是事件接收器仅附加到 DocLib1(elements.xml 中的第一个 receivers

如果我正在尝试实现的目标可以通过我所遵循的方法实现,或者我应该改变我的方法,有人可以指导我吗?

谢谢

阿马尔

这个问题有很好的答案here.

但另一种快速而肮脏的解决方案是将您的 elements.xml 还原为在单个 Receiver 元素中使用 ListTemplateId="101" ,并将您的逻辑包装在以下内容中:

if(properties.ListTitle == "List1" || properties.ListTitle == "List2")
{
    // Your logic here.
}

我一直在努力使用 elements.xml 来实现它,但未能及时实现,所以我求助于使用功能激活事件代码。

我修改了 elements.xml 文件,以便不将此事件与任何内容相关联

<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
  <Receivers>
    <Receiver>
      <Name>EventReceiver1ItemAdded</Name>
      <Type>ItemAdded</Type>
      <Assembly>$SharePoint.Project.AssemblyFullName$</Assembly>
      <Class>NM1.EventReceiver1.EventReceiver1</Class>
      <SequenceNumber>10000</SequenceNumber>
      <Synchronization>Synchronous</Synchronization>
    </Receiver>
  </Receivers>      
</Elements>

然后通过将事件附加到我的功能,我修改了 FeatureActivated 事件并编写了类似这样的内容

public override void FeatureActivated(SPFeatureReceiverProperties properties)
        {
            SPSite site = properties.Feature.Parent as SPSite;
            using (SPWeb web = site.RootWeb)
            {
                web.Lists["DoocLib1"].EventReceivers.Add(SPEventReceiverType.ItemAdded, Assembly.GetExecutingAssembly().FullName, "NM1.EventReceiver1.EventReceiver1");
                web.Lists["DoocLib2"].EventReceivers.Add(SPEventReceiverType.ItemAdded, Assembly.GetExecutingAssembly().FullName, "NM1.EventReceiver1.EventReceiver1");

            }
        }

请注意,该功能的范围至少应为 Site 才能正常工作。

当我有解决方案时,我会继续探索使用 elements.xml 和 post 实现它的方法。

谢谢

阿马尔