2014-02-27 73 views
0

我想創建一個Web應用程序,我有一個按鈕,如果我點擊按鈕,然後指定的文件將被下載並且按鈕應該被禁用。下面的代碼我用這樣做無法禁用按鈕後回發asp.net

protected void btnDownload_Click(object sender, EventArgs e) 
    { 
     btnDownload.Enabled = false; 
     string filepath = @"D:\SomeLayout.pdf"; 
     string filename = Path.GetFileName(filepath); 
     Stream stream = null; 
     try 
     { 
      stream = new FileStream(filepath, FileMode.Open, FileAccess.Read, FileShare.Read); 
      long bytesToRead = stream.Length; 
      Response.ContentType = "application/octet-stream"; 
      Response.AddHeader("Content-Disposition", "attachment; filename=" + filename); 
      while (bytesToRead > 0) 
      { 
       if (Response.IsClientConnected) 
       { 
        byte[] buffer = new Byte[10000]; 
        int length = stream.Read(buffer, 0, 10000); 
        Response.OutputStream.Write(buffer, 0, length); 
        Response.Flush(); 
        bytesToRead = bytesToRead - length; 
       } 
       else 
       { 
        bytesToRead = -1; 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
     } 
     finally 
     { 
      if (stream != null) 
      { 
       stream.Close(); 
      } 
     } 
    } 

一旦我點擊按鈕文件下載,但按鈕仍然啓用。我試過所有下載代碼從其他方法調用,但同樣的問題發生。但是,如果我刪除這些代碼進行下載,那麼點擊按鈕後,它將變爲禁用狀態。我不確定問題的原因,請幫助我獲得解決方案。

的asp.net按鈕我用

<asp:Button ID="btnDownload" runat="server" Text="Download" OnClick="btnDownload_Click"/> 

即使它可以通過Java腳本/用會議要求,jQuery,請建議我一個解決方案。

+1

你的Page_Load中有什麼或者Page_Load調用的另一個函數可能會重新啓用回發按鈕? – mason

+0

@mason不,我沒有在頁面加載中加入任何代碼 – Riki

回答

0

這是超級簡單!

<asp:Button ID="btnDownload" runat="server" Text="Download" OnClick="btnDownload_Click" OnClientClick="$(this).attr('disabled','disabled');return true;"/> 

只需添加OnClientClick="$(this).attr('disabled','disabled');return true;"

以上應該工作。

它做什麼?

當用戶點擊按鈕時,JavaScript將禁用客戶端的按鈕,並返回true,允許回發發生並運行爲OnClick指定的事件處理程序(btnDownload_Click)。

+1

儘管我同意用JavaScript禁用它應該在大多數情況下都能正常工作,但是OP對於瞭解ASP.NET頁面生命週期很重要,它可能會提供解釋爲什麼他的代碼沒有按預期工作。如果他的回發重新啓用按鈕,在客戶端禁用它不會有任何好處。 – mason

+0

@mason同意你的意見。我嘗試了一些與上面的javascript相似的東西,該按鈕保持啓用狀態。 – Riki

-1

您的按鈕被啓用,因爲該頁面可能由於回發事件而被重新加載。

您需要在觸發btnDownload_click事件時在某個會話中設置標誌= 1,然後在Page_load事件中檢查此標誌值以將btnDownload.enabled權限設置爲false。

protected void btnDownload_Click(object sender, EventArgs e) 
{ 
    Session["btnDownload-F9FA7686-319E-4185-A089-17FCC4FDECC1"] = 1; 
} 

protected void Page_Load(object sender, EventArgs e) 
{ 
    if(null != Session["btnDownload-F9FA7686-319E-4185-A089-17FCC4FDECC1"]) 
    { 
     btnDownload.Enabled = !(bool)Session["btnDownload-F9FA7686-319E-4185-A089-17FCC4FDECC1"]; 
    } 
} 
+0

我不知道你爲什麼要這樣做,而不是僅僅檢查Page_Load中是否啓用按鈕。這是非常複雜和不必要的。 – mason

+0

msm8bball,在page_load事件中沒有必要啓用按鈕。 如果頁面由於回發而被加載,所有的控制狀態將被重置爲默認狀態。 –

+0

不,控件在回發後不會重置爲其默認狀態,這就是ViewState存在的原因。我的猜測是,Rahul在Page_Load中有一些東西會導致按鈕在每次回發時重新啓用。 – mason

0

給我,如果你正在使用Webform並沒有禁用Viewstate,頁面使用數據包含它再水化頁上的控制,所以如果你禁用一個按鈕,它應該保持回發後禁用。