2

イントラネットASP.NETアプリケーションがありますが、応答が遅い場合があります。私の要件は、二重送信を防ぎ、理想的には、フォームがすでに送信されているというフィードバックをユーザーに提供することです。

私が見つけた例は、送信ボタンを無効にする方法を示していますが、私のアプリでは送信が発生する可能性があるため、それだけでは不十分です。

  • 送信ボタンから。
  • AutoPostBack = true(javascript AFAIKを使用して送信)の任意のコントロールから。
  • UpdatePanel内の上記のいずれかから-この場合、私が理解しているように、POSTはAJAXを使用して実行され、AJAX呼び出しが完了したときに再度有効にする必要があります。

オーバーレイ/モーダルポップアップを表示するようなものを考えています。おそらく、送信中に表示されるアニメーションの進行状況画像を使用します。また、UpdatePanelの場合、AJAX呼び出しが完了すると非表示になります。

上記のようにASP.NETページに簡単に統合できるサンプルを持っている人はいますか?または、オーバーレイを表示/非表示にするためにフックする必要があるイベントを示します。

アップデート

@Aristosの答えは、私をそこまでの道のりのほとんどに導いてくれました。重要な部分は、PageRequestManager.endRequestを処理して、AJAX呼び出しが完了したときに進行状況ダイアログを非表示にすることです。

それでも問題が発生するケースが1つあります。送信ボタンでファイルがダウンロードされた場合、進行状況ダイアログを非表示にするために使用できるイベントがありません。 この質問には、トリックを行う可能性のある答えがあります。試してみます。

4

1 に答える 1

2

次のように、フラグに基づいてフォームの送信を許可/禁止します。

Page.Form.Attributes["onsubmit"] = "return fAllowToSubmit();";

そして、updatepanel 経由で送信して戻りを待つときに、送信のフラグを閉じて開きます。

 <script type="text/javascript"> 
    var _fAllowToSubmit = true;
    // here you can throw and an alert() when _fAllowToSubmit==false
    function fAllowToSubmit() 
     {
        if(!_fAllowToSubmit)
          alert("Please wait for the page to be updated");

       return _fAllowToSubmit;
     }

    // to avoid calling it before the Sys loaded
    jQuery(document).ready(function() {
      var prm = Sys.WebForms.PageRequestManager.getInstance();    
       prm.add_initializeRequest(InitializeRequest);
       prm.add_endRequest(EndRequest);
    });

    function InitializeRequest(sender, args) {
       _fAllowToSubmit = false;
       // to make it even nicer you can place here a fade css class
       // it will auto-clear with the next update.
       jQuery("#YourWarpDiv").addClass("FadedDiv");
    }

    function EndRequest(sender, args) {
        _fAllowToSubmit = true;
    }
</script>

そしてその

.FadedDiv
{
    background-color: white;
    filter:alpha(opacity=50);
    opacity: 0.5;
    -moz-opacity:0.50;
}

もちろん、更新パネルで自動的に開くことができる「お待ちください」メッセージもあります。

于 2012-07-05T10:50:09.627 に答える