【问题标题】:associate 1 event receiver with 2 document libraries将 1 个事件接收器与 2 个文档库关联
【发布时间】:2017-09-22 16:48:25
【问题描述】:

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

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

然后我阅读了一些关于elements.xml中的receivers标签,发现我可以在elements.xml中注册多个receivers标签。所以我改变了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

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

谢谢

阿马尔

【问题讨论】:

    标签: xml sharepoint elements event-receiver


    【解决方案1】:

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

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

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

    【讨论】:

    • 这是一个现有的应用程序,文档库已经包含大量数据。我不太愿意在生产中与他们一起玩。关于您建议的第二种解决方案,我已经实现了它(因此,作为第一行代码中的一种解决方法,我检查调用事件接收器的库,如果它不是预期的库,则返回。)。
    【解决方案2】:

    我一直在努力使用 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 实现它的方法,并在我有解决方案时发布它。

    谢谢

    阿马尔

    【讨论】:

      猜你喜欢
      • 2010-10-08
      • 1970-01-01
      • 2021-06-12
      • 1970-01-01
      • 2012-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多