none
Timerがバックグランドで処理するページ内で確認メッセージを表示する方法 RRS feed

  • 質問

  • Asp.NetにてWebアプリケーションの開発を行なっているのですが、
    ボタン押下時に確認メッセージを表示したいです。

    ページロードイベント中に"onclick"時の処理を登録する
    ことで実現できそうなのですが、
    [OK]ボタンを押しても処理が行なわれない時があります。

    バックグラウンドでTimerが動作していることが
    原因ではないかと思うのですが、
    回避策が思いつかない状態です。

    Timerがバックグランドで処理するページ内で
    確認メッセージを表示する方法がありましたらご教授頂きたいです。

    本現象の確認は以下の環境を行いました。


     OS   :Windows2008R2
     IDE   :Visual Studio2010 SP1
     プロジェクトテンプレート:ASP.NET 空のWeb アプリケーション(C#)
     
     aspx(デザイン)
        --
     ScriptManager
     UpdatePanel
     Timer
     Button
     --

     cs(コード)
     --
     protected void Page_Load(object sender, EventArgs e)
            {
                Button1.Attributes["onclick"] = "return confirm('確認メッセージのテストです。');";
            }

            protected void Timer1_Tick(object sender, EventArgs e)
            {
       //Timer処理
            }

            protected void Button1_Click(object sender, EventArgs e)
            {
                //本処理
            }
        --


    よろしくお願いします。

    2011年6月6日 7:16

回答

  • > [OK]ボタンを押しても処理が行なわれない時があります。

    Timer も Button も UpdatePanel のトリガとして使用されていて、非同期
    ポストバックがかかるのですよね?

    そうだとするとタイミングの問題ではないかと思います。

    即ち、例えば、Bottun をクリックでポストバックがかかるが、応答が帰っ
    てこないうちに Timer でポストバックされ、「Timer 処理」の結果しか帰
    ってこないからではないでしょうか?

    PageManagerRequest クライアントオブジェクトを利用して、すでに実行中
    のリクエストが終了するまで、他のリクエストをキャンセルするように実装
    してはいかがですか。

     


    • 編集済み SurferOnWww 2011年6月6日 13:27 誤記訂正
    • 回答としてマーク ゴートラ 2011年6月8日 6:10
    2011年6月6日 13:26

すべての返信

  • > [OK]ボタンを押しても処理が行なわれない時があります。

    Timer も Button も UpdatePanel のトリガとして使用されていて、非同期
    ポストバックがかかるのですよね?

    そうだとするとタイミングの問題ではないかと思います。

    即ち、例えば、Bottun をクリックでポストバックがかかるが、応答が帰っ
    てこないうちに Timer でポストバックされ、「Timer 処理」の結果しか帰
    ってこないからではないでしょうか?

    PageManagerRequest クライアントオブジェクトを利用して、すでに実行中
    のリクエストが終了するまで、他のリクエストをキャンセルするように実装
    してはいかがですか。

     


    • 編集済み SurferOnWww 2011年6月6日 13:27 誤記訂正
    • 回答としてマーク ゴートラ 2011年6月8日 6:10
    2011年6月6日 13:26

  • SurferOnWwwさん

    ありがとうございました。

    ご助言頂いたPageRequestManagerオブジェクトを利用することで、
    解決致しました。

    対応方法としては、
    確認メッセージを表示する直前で、他の非同期ポストバックを中断する処理を
    追加しました。

     aspx(デザインソース)
     --
     <script type="text/javascript">
     function CancelAsyncPostBack() {
         var prm = Sys.WebForms.PageRequestManager
                                .getInstance();
         if (prm.get_isInAsyncPostBack()) {
             prm.abortPostBack();
         }
     }
     </script>
     --

     cs(コード)
     --
     protected void Page_Load(object sender, EventArgs e)
            {
                //Button1.Attributes["onclick"] = "return confirm('確認メッセージのテストです。');";
                Button1.Attributes["onclick"] = "CancelAsyncPostBack();return confirm('確認メッセージのテストです。');";
            }

            protected void Timer1_Tick(object sender, EventArgs e)
            {
                //Timer処理
            }

            protected void Button1_Click(object sender, EventArgs e)
            {
                //本処理
            }
        --

    2011年6月8日 6:10