1

当从事件接收器外部执行更新时,我遇到了这篇文章,它为防止事件接收器触发 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 用作事件接收器?

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

4

2 回答 2

1

该代码禁用了项目的所有事件触发,这就是 finally 块如此重要的原因(无论更新成功,它都会将其重新打开)。

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

于 2011-04-07T15:52:25.383 回答
0

我的猜测是,这会全局禁用项目事件接收。我也看不到关联的创建位置。

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

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

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

于 2011-04-07T15:53:19.290 回答