2012-10-19 30 views
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文件传输),就重新启用它们?

+0

Prevously问http://stackoverflow.com/questions/6137172/how-do-i-prevent-users-clicking-a-button-twice – David

+0

myButton.Enabled =假? – LightStriker

+0

该问题只解答了我的一半问题,并未回答如何重新启用按钮。此外myButton.Enabled无法工作,因为Asp.Net的响应不是重新呈现HTML,因为它只是返回文件内容 – KallDrexx

回答

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

+0

您可以删除this.classname属性,因为我给样式的类名称。谢谢。 –

+0

虽然这并没有解决我的问题的后半部分,但是在接收到响应之后重新启用按钮。 – KallDrexx

2

试图在这里条条框框。而不是禁用/启用提交按钮,也许你可以设置一个会话级别的变量,指出报告正在运行。如果用户在处理先前的请求时再次单击提交按钮,则不要启动新的进程。

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

想法?

+0

我看到的唯一的潜在问题是,如果浏览器将忽略与文件下载的响应,如果用户由于按下按钮已经重新加载页面(因此触发非下载回发) – KallDrexx

+0

我不确定是什么你的意思是,对不起。但是据说,我认为@jvenema发布的解决方案是更好的解决方案。它看起来就像你正在寻找的东西。 –

+0

是的,我说这个评论很糟糕。我想我在想的是我不知道浏览器如何处理您点击潜在下载链接的情况,然后在响应进入到另一个页面之前。 – KallDrexx

相关问题