none
イベントハンドラのアフターイベント後ユーザーにメッセージを表示する方法 RRS feed

  • 質問

  • 度々お世話になっております。
    もう1点ご教授いただきたく、質問させていただきました。

    イベントハンドラのアフターイベント後ユーザーにメッセージを表示する方法が無いでしょうか。

    アフターイベントのcatchで新アイテムを作成しその際の、
    ビフォーイベントでエラーメッセージを表示しようとしましたが、
    うまく行きませんでした。
    良い方法があれば教えていただけると助かります。

    また、イベント ItemUpdated 中に SPUtility.Redirect("URL") を入れてみましたが、
    「オブジェクト参照がオブジェクト インスタンスに設定されていません」 とエラーになってしまいました。
    イベントハンドラ中の記述はどのようにすればよいかアドバイスいただけないでしょうか。


    よろしくお願いいたします。
    2010年1月26日 8:13

回答

  • 結論から言うと、Afterイベント後にユーザーにメッセージを表示する方法はないと思います。
    もしできたとしても、かなりゴニョゴニョやらないといけなくて、今後のメンテナンスとかを考えるとちょっと・・・っていう感じになってしまうかと思います。

    ItemUpdatedイベントでRedirectをしようとしてエラーになるのは、このタイミングではHttpContextが存在しないからです。
    After系のイベントハンドラはアイテム登録を行うメインの処理とは別のスレッドで動いており、HttpContextの情報を引き継いでこないので、Redirectができないんです。
    なので、After系イベントハンドラをASP.NETのイベントと同じように扱おうと思っても、そのようには動いてくれないんです。


    上記2点の解決策としては、アイテム保存ボタンをoverrideした独自のアイテム保存ボタンを作り、イベントハンドラの仕組みを使わずにアイテム登録後の処理を記述するというものがあります。
    ↓このクラスですね。
    http://msdn.microsoft.com/ja-jp/library/microsoft.sharepoint.webcontrols.savebutton.aspx

    にしても、このカスタムボタンを組み込んだリストテンプレートを作らないといけなかったりして、何かと不自由です。色々やれることは広がりますが・・・
    あとは、そもそも登録フォームをASP.NETで作ってしまうという手もあるかと思います。

    2010年1月28日 15:51
  • おりば~ず様

    いつもありがとうございます。

    おりば~ず様より回答をいただく前にUSのサイトで以下のロジックを発見し、
    試してみました。

    とりあえず、指定したURLにRedirectするようですが、使用に問題点があるでしょうか。
    重ねての質問で恐縮です。
    よろしくお願いいたします。

    ↓↓↓↓↓↓サンプルロジック

    public class RPClass:SPItemEventReceiver
    {
    HttpContext current;
    static object obj;

     public RPClass()
     {
      if (current == null)
      {
       current = HttpContext.Current;
      }
     }

     public override void ItemAdded(SPItemEventProperties properties)
     {
      current = (HttpContext)obj;
      SPUtility.Redirect("http://manoj.com/default.aspx", SPRedirectFlags.Trusted, current);
     }

     public override void ItemAdding(SPItemEventProperties properties)
     {
      obj = current;
      System.Threading.Thread.Sleep(5000);

     }

    以上です。
    2010年2月1日 3:54

すべての返信

  • 結論から言うと、Afterイベント後にユーザーにメッセージを表示する方法はないと思います。
    もしできたとしても、かなりゴニョゴニョやらないといけなくて、今後のメンテナンスとかを考えるとちょっと・・・っていう感じになってしまうかと思います。

    ItemUpdatedイベントでRedirectをしようとしてエラーになるのは、このタイミングではHttpContextが存在しないからです。
    After系のイベントハンドラはアイテム登録を行うメインの処理とは別のスレッドで動いており、HttpContextの情報を引き継いでこないので、Redirectができないんです。
    なので、After系イベントハンドラをASP.NETのイベントと同じように扱おうと思っても、そのようには動いてくれないんです。


    上記2点の解決策としては、アイテム保存ボタンをoverrideした独自のアイテム保存ボタンを作り、イベントハンドラの仕組みを使わずにアイテム登録後の処理を記述するというものがあります。
    ↓このクラスですね。
    http://msdn.microsoft.com/ja-jp/library/microsoft.sharepoint.webcontrols.savebutton.aspx

    にしても、このカスタムボタンを組み込んだリストテンプレートを作らないといけなかったりして、何かと不自由です。色々やれることは広がりますが・・・
    あとは、そもそも登録フォームをASP.NETで作ってしまうという手もあるかと思います。

    2010年1月28日 15:51
  • おりば~ず様

    いつもありがとうございます。

    おりば~ず様より回答をいただく前にUSのサイトで以下のロジックを発見し、
    試してみました。

    とりあえず、指定したURLにRedirectするようですが、使用に問題点があるでしょうか。
    重ねての質問で恐縮です。
    よろしくお願いいたします。

    ↓↓↓↓↓↓サンプルロジック

    public class RPClass:SPItemEventReceiver
    {
    HttpContext current;
    static object obj;

     public RPClass()
     {
      if (current == null)
      {
       current = HttpContext.Current;
      }
     }

     public override void ItemAdded(SPItemEventProperties properties)
     {
      current = (HttpContext)obj;
      SPUtility.Redirect("http://manoj.com/default.aspx", SPRedirectFlags.Trusted, current);
     }

     public override void ItemAdding(SPItemEventProperties properties)
     {
      obj = current;
      System.Threading.Thread.Sleep(5000);

     }

    以上です。
    2010年2月1日 3:54
  • 返信が遅れてしまい申し訳ございません。

    このコードを読む限り行けそうですね。
    HttpContextをBefore系イベントの中で取得して、それを使いまわすというわけですね。
    なるほど~。

    であれば問題ないと思います。

    勉強になりました。ありがとうございました!
    2010年2月9日 16:02