c# - 当表单请求导致文件下载时,如何防止按钮按下直到表单请求完成

标签 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 文件传输)后重新启用它们?

最佳答案

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

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

关于c# - 当表单请求导致文件下载时,如何防止按钮按下直到表单请求完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12977426/

相关文章:

ASP.Net session

asp.net - 如何在SqlDataSource中为存储过程指定参数值

jquery - Asp.net MVC - Jquery $.ajax 错误回调未返回responseJSON

c# - Resharper 可以跳过 async/await 关键字吗?

c# - 面板控件中的对齐按钮

c# - 在 C# 中将超出范围的数字转换为枚举不会产生异常

.net - 在 Windows (.Net) 上转换 JPEG 色彩空间(Adobe RGB 到 sRGB)

c# - 在 C# 中调用 C++ 方法

c# - 在 raspbian 上用 mono 执行 shell 命令

javascript - 将删除图标添加到确认弹出窗口