【问题标题】:Recursive SharePoint Event Handers递归 SharePoint 事件处理程序
【发布时间】:2014-02-21 21:23:14
【问题描述】:

我有一个事件接收器,用于更新列表项(ItemUpdated 而不是 ItemUpdating)。然后在接收器内部,我再次更新列表项。正如我所料,这自然会引发一些递归事件调用。在事件处理程序的开头放置一个断点,我数它在事件中停止 10 次,然后它就结束了。 SharePoint 内部是否有某种递归保护来防止此类事情发生?

【问题讨论】:

    标签: c# sharepoint event-handling


    【解决方案1】:

    使用 DisableEventFiring 方法

    base.DisableEventFiring();
    item.update();
    base.EnableEventFiring();

    【讨论】:

    • 这是在 SharePoint 2007 中唯一正确的方法,并且 EventFiringEnabled = true/false;是 SharePoint 2010 中唯一正确的方法。
    【解决方案2】:

    更安全的方法:

    try {
      this.DisableEventFiring();
      item.SystemUpdate();  // or item.Update(); or item.UpdateOverwriteVersion();
    } finally {
      this.EnableEventFiring();
    }
    

    以防万一您的更新调用由于某种原因失败。

    【讨论】:

      【解决方案3】:

      现代方式(未贬低):

      EventFiringEnabled = false;
      item.Update();
      EventFiringEnabled = true;
      

      【讨论】:

        【解决方案4】:

        或者使用 item.SystemUpdate(),SystemUpdate 会在不触发任何附加到 item 的事件的情况下进行更新。

        【讨论】:

        • 两者都是很好的答案,但您的解决方案更简洁。干杯
        • 我同时使用这两个。我遇到过 SystemUpdate 没有停止递归而没有 DisableEventFiring 的情况。即使我们使用 DisableEventFiring,我也调用 SystemUpdate(false),因为我不想从事件接收器中更改修改者或项目版本。
        • -1。这是不准确的,SystemUpdate() 是一种不透明的方法,您不知道其实现,它仅记录在更新而不影响修改时间或修改者字段或可选项目版本的更改。它在 SharePoint 内部用于诸如讨论板之类的事情,您不想在其中修改帖子的原始作者等。事件确实会触发,实际上您现在依赖的用于停止事件传播的功能几乎即将发布在 SharePoint 2010 中进行更改,并且可能在将来进行。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-09-11
        • 2011-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多