2009-04-22 151 views
2

保存對話框將文件保存到本地計算機。但在那之後,我的頁面就站在那裏,對我的其他過程沒有任何幫助。我用下面的代碼打開一個保存對話框ASP.NET中的頁面刷新

protected void lnkbtnDownload_Click(object sender, EventArgs e) 
{ 
    string fileName = startupPath + "bin\\Inbox.mdb"; 
    System.IO.FileInfo targetFile = new System.IO.FileInfo(fileName); 

    if (targetFile.Exists) 
    { 
     Response.Clear(); 
     Response.AddHeader("Content-Disposition", "attachment; filename=" + targetFile.Name); 
     Response.AddHeader("Content-Length", targetFile.Length.ToString()); 
     Response.ContentType = "application/octet-stream"; 
     Response.WriteFile(targetFile.FullName);       
     Response.End(); 
    } 
} 

的HTML代碼:

<asp:Button id="lnkbtnDownload" runat="server" CausesValidation="false" 
    Text="Download" CssClass="buttonstyle" OnClick="lnkbtnDownload_Click"></asp:Button> 

但該文件後保存到本地機器上保存對話框是接近的,我的網頁沒有任何反應在所有。我可以知道如何在保存對話框關閉後回發頁面?

回答

9

因爲你到Response.End調用,這個暫停頁面的響應。

+1

是的但由於響應的內容類型已從「text/html」更改爲「application /八位字節流」也就沒有在瀏覽器中渲染輸出我也建議使用一個處理程序以服務出文件。 - 例如,你可以在查詢字符串,以確定所需的文件傳遞一個GUID – 2009-04-22 12:47:15

4

我想你應該打開一個彈出頁面/處理程序,執行此Response.WriteFile操作。

+0

target =「_ blank」< - 您可以將此添加到您的LinkBut​​ton中(即使Visual Studio會給你縮進 – 2009-05-27 04:56:46

0

我想說你可以在iframe中運行這個代碼,或者你可以打開一個彈出窗口來觸發文件下載。在這種情況下,您正在覆蓋響應,並且您預期會加載的頁面將丟失。

因此,我會將此代碼移入專用頁面並實施上述兩種解決方案之一。

0

您無法回答2個響應的單個請求(即按鈕回發)。

但是,您可以將回發更改爲重定向到單獨的下載/確認頁面,然後使用iframe啓動下載。

this question

5

內放一個HttpHandler這個代碼,然後鏈接到處理器從原來的頁面,傳遞任何信息的處理需要。

+0

天哪,有一個可怕的很多在這個問題上似乎發生了爭議。簡單的HttpHandler解決方案似乎是解決這個問題的直接而正確的方法。 – 2009-08-11 12:51:38

1

馬克·布拉克特的answer到類似的問題,應該在這裏工作,除了你不需要跨網頁提交url屬性:

<script type="text/javascript"> 
    var oldTarget, oldAction; 
    function newWindowClick(target) { 
     var form = document.forms[0]; 
     oldTarget = form.target; 
     oldAction = form.action; 
     form.target = target; 

     window.setTimeout(
     "document.forms[0].target=oldTarget;" 
     + "document.forms[0].action=oldAction;", 
     200 
    ); 
    } 
</script> 

<asp:LinkButton runat="server" id="lnkbtnDownload" 
    CausesValidation="false" Text="Download" CssClass="buttonstyle" 
    OnClick="lnkbtnDownload_Click" 
    OnClientClick="newWindowClick('download');" /> 

這將導致在新窗口中出現的回傳,和你現有的響應處理將負責下載。原始窗口表單將被恢復用於將來的交互/回傳。