2009-04-22 105 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');" /> 

这将导致在新窗口中出现的回传,和你现有的响应处理将负责下载。原始窗口表单将被恢复用于将来的交互/回传。