用于防止SharePoint列表项事件接收器帮助的扩展方法

时间:2011-04-07 15:42:09

标签: c# sharepoint-2007 extension-methods splistitem eventreceiver

我遇到了这个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作为事件接收器?

我希望我已经清楚地解释了这一点。如果不让我知道,我会进一步澄清。

2 个答案:

答案 0 :(得分:1)

代码正在禁用项目的所有事件触发,这就是为什么Finally块如此重要的原因(无论更新是否成功,它都会重新开启)。

文档:http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spitemeventreceiver_members(v=office.12).aspx

答案 1 :(得分:0)

我猜这是全局禁用项目事件接收。我无法看到创建关联的位置。

我想知道创建此解决方案的人是否在同时更新项目时尝试过此操作。如果SharePoint是基于每个请求执行此操作(请求的全局,而不是SharePoint实例),那么它可能相对安全。

这些方法已在SharePoint 2010文档中标记为过时的API。

http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spitemeventreceiver_members.aspx