2012-10-19 26 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

相關問題