5

在我的 Asp.net webforms 站点中,我有一个表单,用户可以在其中选择各种选项,这些选项会在回发中发回,该回发会生成 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 回答