将 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 实现它的方法。
谢谢
阿马尔
我有一个项目更新事件接收器,我只想将其与 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 实现它的方法。
谢谢
阿马尔