2012-11-12 374 views
2

我有以下代碼從服務器下載文件到客戶端,發生按鈕btnSavetoDB_ExportToExcel點擊後,我想要的按鈕禁用,如何可以我做到了嗎?禁用按鈕無法正常工作後,下載文件asp.net

string fileName = newFN + ".xlsx"; 
       Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 
       Response.AddHeader("Content-Disposition", "attachment;filename=" + fileName); 
       Response.TransmitFile(DestFile);      
       Response.End(); 
btnSavetoDB_ExportToExcel.Enabled = false; 

我注意到,放置在上面的代碼(響應)按鈕時,沒有成爲禁用,因爲我已經有另一種代碼和按鈕成了它禁用。所以它一定是與Response相關的東西。

編輯:

的按鈕是一個ModalPopupExtender萬一它的事項範圍內。

+0

請注意,您指定的文件名Content-Disposition頭。如果該值包含逗號,某些瀏覽器將不會喜歡它。最好對文件名進行編碼或用引號將其包裝。 –

回答

0

我已經找到了解決我的問題,要歸功於:戴夫·沃德(click here)

<asp:Button ID="btnSavetoDB_ExportToExcel" runat="server" 
        OnClientClick="this.disabled = true;" 
        UseSubmitBehavior="false" 
        Text="Save results to DB and export to Excel" 
        onclick="btnSavetoDB_ExportToExcel_Click" /> 

這樣做的伎倆: OnClientClick="this.disabled = true;" UseSubmitBehavior="false"

1

原因是,如果您禁用帶有服務器代碼的按鈕,則需要將響應返回到瀏覽器窗口。

在這裏,您將瀏覽器捕獲的流作爲文件而不是瀏覽器窗口返回,因此當前顯示從不更新。

爲了解決這個問題,你可以在html本身的按鈕上實現一個javascript行。

您可以在代碼在Page_Load中使用Attribute.Add(),f.ex:因爲你是在使用Response.End()

btnSavetoDB_ExportToExcel.Attribute.Add("onclick","this.disabled=true") 
+0

區別在於,javascript在點擊之前安裝在按鈕上,因此它在點擊之前是可用的。當您再次單擊該按鈕時,它將在下次回發之前被禁用。 – K3N

+0

我的問題在於您的解決方案,因爲我在「ModalPopupExtender」中有按鈕。我無法獲取按鈕禁用:( – Somebody

+0

在這種情況下,請檢查擴展上的OnOkScript屬性。 – K3N

0

正如在其他答覆中提到,按鈕應在客戶端禁用(你的代碼,ASP.NET將永遠不會與具有Enabled=False按鈕顯示頁面。

在.aspx文件中添加

<asp:Button ID="btnSavetoDB_ExportToExcel" OnClientClick="this.disabled=true;" [..] /> 

還要注意這個MIG不是一個好主意 - 如果用戶在文件下載窗口中意外點擊「取消」會怎麼樣?

更好的解決方案(理解是,要防止用戶點擊按鈕多次)是添加一個計時器,以重新啓用按鈕:

<asp:Button ID="btnSavetoDB_ExportToExcel" OnClientClick="var a=this; a.disabled=true; window.setTimeout(function() { a.disabled=false; }, 5000)" [..] /> 

價值5000是在毫秒的時間之後該按鈕將被重新啓用。

+0

當我添加OnClientClick代碼時,該按鈕變爲禁用,但沒有後面的代碼被執行:( – Somebody

1

至少有兩種可能的解決方案。
1)您可以在服務器上的臨時目錄中生成文件,並向用戶提供指向該文件的鏈接(或重定向到此鏈接),而不是將文件寫入響應。

2)如果要使用寫入響應,可以創建新的Generate.aspx頁面,該頁面將文件寫入Page_Load方法中的響應。

if (Request.QueryString["ID"] != null) 
{ 
    //find file by its ID 
    ... 
    Response.AddHeader("Content-disposition", "attachment; filename=" + fileName)); 
    Response.ContentType = "application/octet-stream"; 
    Response.WriteFile(fullFileName); 
    Response.End(); 
} 

在你btnSavetoDB_ExportToExcel頁Page_Load添加以下代碼:

var script = @"<script language=JavaScript>function Export(fileID) 
{ 
     var iframe = document.createElement('iframe'); 
     iframe.src = 'Generate.aspx?ID='+ fileID; 
     iframe.style.display = 'none'; 
     document.body.appendChild(iframe); 
} 
</script>"; 

Page.RegisterStartupScript("Startup", script); 

然後就是調用JavaScript Export方法將文件發送給用戶。

+0

嗨亞歷山大,你的第一種方法是我做的,但是如何在點擊按鈕時重定向到文件的鏈接?正如你所看到的,我有文件路徑 – Somebody

+0

你是否嘗試過將用戶重定向到文件?Response.Redirect(http:///yoursite.com/generated/f7401466-40ac-4150-b45a-9fa9dc40a9d8/file.xlsx)'?? – Alex

+0

好吧,我現在可以通過'Response.Redirect'下載文件,但按鈕保持啓用狀態,它不會在獲得後禁用這:( – Somebody