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

C# 当表单请求导致文件下载时,如何防止在表单请求完成之前按下按钮,c#,asp.net,C#,Asp.net,在我的Asp.net webforms网站中,我有一个表单,用户可以在其中选择各种选项,这些选项将在回发中发送回,该回发生成PDF报告,并通过以下代码将该文件发送回用户以供下载: protected void btnTopGenReport_Click(object sender, EventArgs e) { var stream = new PodMainReportGenerator().GenerateReport(GetReportParameters(

在我的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文件传输已启动)后重新启用它们?

//要禁用按钮,请在页面加载时编写以下代码

    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';");
有关更多信息,您还可以参考以下链接:


尝试跳出框框思考。您可以设置一个会话级别变量来指示报表正在运行,而不是禁用/启用submit按钮。如果用户在处理上一个请求时再次单击提交按钮,请不要启动新的进程

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


想法?

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


之前的问题只回答了我问题的一半,没有回答如何重新启用按钮。此外,myButton.Enabled也不起作用,因为Asp.Net的响应不会重新呈现HTML,因为它只是返回文件内容。在我为样式指定类名时,您可以删除this.classname属性。谢谢。但这并没有解决我问题的后半部分,即在收到响应后重新启用按钮。这是一个有趣的想法。事实上,我看到的唯一潜在问题是,如果用户已因按下按钮而重新加载页面,则浏览器将忽略文件下载的响应(从而触发非下载回发)我不知道你的意思,抱歉。不过,我认为@jvenema发布的解决方案是更好的解决方案。它看起来正是你想要的。是的,我的评论措辞很糟糕。我想我想我不知道浏览器如何处理你点击潜在下载链接的情况,然后在e响应进入导航到另一个页面。我相信这对于您实现的任何解决方案都是一个问题,不是吗?或者我又错过了什么吗?:)