我遇到了这个post,它解决了在从事件接收器外部执行更新时阻止SPListItem触发事件接收器的问题。代码按照描述100%工作,我对解决方案印象深刻,问题是我不完全理解它。
为了简单起见,我们忽略了SystemUpdate方法,因此我们只处理SPListItem.Update重载和代码中声明的私有类。
我没有“得到”的是类rh如何与SPListItem项“链接”或“关联”。重现方法以保存点击返回...
public static void Update(this SPListItem item, bool doNotFireEvents)
{
SPItemEventReceiverHandling rh = new SPItemEventReceiverHandling();
if (doNotFireEvents)
{
try
{
rh.DisableEventFiring();
item.Update();
}
finally
{
rh.EnableEventFiring();
}
}
else
{
item.Update();
}
}
我可以看到我们实例化了一个SPItemEventReceiverHandling,rh的实例,如果doNotFireEvents为真,我们在rh上调用DisableEventFiring(),然后在完成时我们在rh上调用EnableEventFiring()。我看不到的链接是“rh”和“item”之间的链接。在进行更新时,SharePoint如何“知道”使用rh作为事件接收器?
我希望我已经清楚地解释了这一点。如果不让我知道,我会进一步澄清。
答案 0 :(得分:1)
代码正在禁用项目的所有事件触发,这就是为什么Finally块如此重要的原因(无论更新是否成功,它都会重新开启)。
答案 1 :(得分:0)
我猜这是全局禁用项目事件接收。我无法看到创建关联的位置。
我想知道创建此解决方案的人是否在同时更新项目时尝试过此操作。如果SharePoint是基于每个请求执行此操作(请求的全局,而不是SharePoint实例),那么它可能相对安全。
这些方法已在SharePoint 2010文档中标记为过时的API。
http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spitemeventreceiver_members.aspx