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 が true の場合は、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 に答える