当表单请求导致文件下载时,如何在表单请求完成之前阻止按下按钮

时间:2012-10-19 15:21:19

标签: c# asp.net

在我的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文件传输)后,如何禁用表单按钮但重新启用它们?

3 个答案:

答案 0 :(得分:4)

您只需要响应内容之外的指示符即可通知您下载已完成。尝试使用cookie监视器,将cookie设置为下载响应的一部分,并在主页中监视cookie的存在。

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

答案 1 :(得分:2)

试着在这里开箱即思考。您可以设置会话级变量,指示报表正在运行,而不是禁用/启用提交按钮。如果用户在处理上一个请求时再次单击“提交”按钮,请不要启动新进程。

为了获得更好的UI体验,您可能希望在提交表单之前触发AJAX调用,以检查先前的进程是否正在运行。如果是,您可以取消表单提交并显示“您之前的请求仍在处理中”的消息。

思想?

答案 2 :(得分: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

Button disable function after clicking on it

Disable the asp button after first click because it save multiple records in slow connection