5

私のAsp.netWebフォームサイトには、ユーザーがさまざまなオプションを選択するフォームがあり、それらのオプションは、PDFレポートを生成し、次のコードを介してダウンロードするためにそのファイルをユーザーに送り返すポストバックで返送されます。

    protected void btnTopGenReport_Click(object sender, EventArgs e)
    {
        var stream = new PodMainReportGenerator().GenerateReport(GetReportParameters());

        var bytes = stream.ToArray();
        stream.Close();

        // Set the content headers
        Response.Clear();
        Response.Buffer = true;
        Response.ContentType = "application/pdf";
        Response.AddHeader("Content-Disposition", "attachment;filename=testReport.pdf");
        Response.AddHeader("Content-Length", bytes.Length.ToString());

        Response.BinaryWrite(bytes);

        Response.End();
    }

問題は、必要なデータと処理の量のために、このレポートの生成に10秒ほどかかる可能性があることですが、人々が焦ってボタンを何度もクリックすることを望んでいません。

通常のページでは、クリック時にボタンを無効にするJavaScriptを追加します。これが機能するのは、ポストバックが完了すると、サーバーがフォームボタンを再度有効にして戻ってくるためです。ただし、フォームの応答はHTMLページではなく、ダウンロードされたファイルであるため、検出方法がわかりません。

基本的に、フォームのボタンを無効にし、サーバーから応答を受け取ったら(そして、httpファイル転送が開始されたら)再度有効にするにはどうすればよいですか?

4

3 に答える 3

4

ダウンロードが完了したことを通知するには、応答コンテンツの外部にインジケーターが必要です。ダウンロード応答の一部としてCookieを設定するCookieモニターを使用してみてください。メインページで、そのCookieの存在を監視してください。

http://gruffcode.com/2010/10/28/detecting-the-file-download-dialog-in-the-browser/

于 2012-10-19T17:06:22.380 に答える
2

ここで箱の外で考えようとしています。送信ボタンを無効/有効にする代わりに、レポートが実行されていることを示すセッションレベル変数を設定できる場合があります。前のリクエストの処理中にユーザーが送信ボタンをもう一度クリックした場合は、新しいプロセスを開始しないでください。

UIエクスペリエンスを向上させるために、フォームが送信される前にAJAX呼び出しを実行して、前のプロセスが実行されているかどうかを確認することをお勧めします。そうである場合は、フォームの送信をキャンセルして、「以前のリクエストはまだ処理中です」というメッセージを表示できます。

考え?

于 2012-10-19T16:36:37.630 に答える
0

//ボタンを無効にするには、ページの読み込み時に以下のコードを記述します。

    System.Text.StringBuilder sbValid = new System.Text.StringBuilder();
    sbValid.Append("if (typeof(Page_ClientValidate) == 'function') { ");
    sbValid.Append("if (Page_ClientValidate() == false) { return false; }} ");
    sbValid.Append("this.value = 'Saving..';");
    sbValid.Append("this.className  = 'Save_Button_Active';");
    sbValid.Append("this.disabled = true;");
    sbValid.Append(this.Page.GetPostBackEventReference(this.btnName));
    sbValid.Append(";");
    this.btnName.Attributes.Add("onclick", sbValid.ToString());
    this.btnName.Attributes.Add("onclick", "this.className  = 'Cancel_Button_Active';");

詳細については、次のリンクを参照することもできます。

http://bytes.com/topic/c-sharp/answers/887893-disabled-button-calling-even-handler-button-click

クリック後のボタン無効機能

低速接続で複数のレコードを保存するため、最初のクリック後にaspボタンを無効にします

于 2012-10-19T15:26:41.273 に答える