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