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

本文关键字:帮助 接收器 扩展 方法 事件 SharePoint 列表 用于 | 更新日期: 2023-09-27 17:49:28

我偶然看到这篇文章,它提供了一个很好的解决方案,可以在从事件接收器外部执行更新时防止SPListItem上的事件接收器触发。代码100%按照描述工作,我对解决方案印象深刻,问题是我不完全理解它。

为了简单起见,让我们忽略SystemUpdate方法,所以我们只处理SPListItem。更新重载和代码中声明的私有类。

我不"明白"的是类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是true,我们在rh上调用DisableEventFiring(),然后当完成时,我们在rh上调用EnableEventFiring()。我看不出"rh"answers"item"之间的联系。如何SharePoint"知道"使用rh作为事件接收者时做更新?

我希望我已经解释清楚了。

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

代码禁用所有事件触发的项目,这就是为什么最后块是如此重要(它会打开它,不管更新成功)。

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

我猜这是全局禁用项目事件接收。我也看不出这个协会是在哪里创建的。

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

这些方法在SharePoint 2010文档中被标记为Obsolete API。

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