在ASP.NET中将文件写入响应后Post Back不起作用

我拥有的?

我有一个ASP.NET页面,允许用户通过点击button下载文件。 用户可以从可用文件列表(RadioButtonList)中select他想要的文件,然后点击下载button下载。 (我不应该提供每个可下载文件的链接 – 这是要求)。

我想要什么?

我希望用户通过select所需的单选button并单击button来逐一下载多个文件。

我面临什么问题?

我可以正确地第一次下载文件。 但是,下载后,如果我select其他文件,点击button下载,点击button事件不会回发,第二个文件将不会被下载。

我在button单击事件上使用下面的代码:

 protected void btnDownload_Click(object sender, EventArgs e) { string viewXml = exporter.Export(); Response.Clear(); Response.AddHeader("Content-Disposition", "attachment; filename=views.cov"); Response.AddHeader("Content-Length", viewXml.Length.ToString()); Response.ContentType = "text/plain"; Response.Write(viewXml); Response.End(); } 

我在这里做错了什么?

同样的问题可以在IE6,IE7和Chrome中复制。 我认为这个问题是独立于浏览器的。

我有同样的问题与sharepoint。 我在发送文件的页面上有一个button,点击button后,表单的其余部分没有响应。 原来,这是一个共享点的事情,设置variables_spFormOnSubmitCalled为true,以防止任何进一步的提交。 当我们发送一个文件时,这不会刷新页面,所以我们需要手动设置这个variables为false。

在webpart的button中,将OnClientClick设置为页面中javascript的函数。

  <asp:Button ID="generateExcel" runat="server" Text="Export Excel" OnClick="generateExcel_Click" CssClass="rptSubmitButton" OnClientClick="javascript:setFormSubmitToFalse()" /> 

然后在JavaScript中我有这个function。

 function setFormSubmitToFalse() { setTimeout(function () { _spFormOnSubmitCalled = false; }, 3000); return true; } 

我find了3秒的停顿是必要的,否则我在设置sharepoint之前设置了variables。 这样我就可以让Sharepoint正常设置,然后我把它设置回false。

不用说,你在做什么应该工作。 我已经成功地做了类似的过去,虽然我用了一个中继器和LinkBut​​tons。

我唯一能看到的不同是你使用的是Response.Write()而不是Response.OutputStream.Write() ,而且你写的是文本而不是二进制文件,但是给定你指定的ContentType ,不成问题。 另外,我在发送信息之前调用Response.ClearHeaders()然后在调用Response.ClearHeaders()之前调用Response.End() )。

如果有帮助的话,下面是对我有用的一个消毒版本:

 // called by click handler after obtaining the correct MyFileInfo class. private void DownloadFile(MyFileInfo file) { Response.Clear(); Response.ClearHeaders(); Response.ContentType = "application/file"; Response.AddHeader("Content-Disposition", "attachment; filename=\"" + file.FileName + "\""); Response.AddHeader("Content-Length", file.FileSize.ToString()); Response.OutputStream.Write(file.Bytes, 0, file.Bytes.Length); Response.Flush(); Response.End(); } 

您可能需要考虑以二进制方式传输文件,也许可以通过调用System.Text.Encoding.ASCII.GetBytes(viewXml); 并将其结果传递给Response.OutputStream.Write()

稍微修改你的代码:

 protected void btnDownload_Click(object sender, EventArgs e) { string viewXml = exporter.Export(); byte [] bytes = System.Text.Encoding.ASCII.GetBytes(viewXml); // NOTE: you should use whatever encoding your XML file is set for. // Alternatives: // byte [] bytes = System.Text.Encoding.UTF7.GetBytes(viewXml); // byte [] bytes = System.Text.Encoding.UTF8.GetBytes(viewXml); Response.Clear(); Response.ClearHeaders(); Response.AddHeader("Content-Disposition", "attachment; filename=views.cov"); Response.AddHeader("Content-Length", bytes.Length.ToString()); Response.ContentType = "application/file"; Response.OutputStream.Write(bytes, 0, bytes.Length); Response.Flush(); Response.End(); } 

一个简单的方法来做到这一点,而不删除Response.End是添加客户端js做页面刷新。 将js添加到button的onclientclick属性中。

例如

  onclientclick="timedRefresh(2000)" then in your html.. <script type="text/JavaScript"> <!-- function timedRefresh(timeoutPeriod) { setTimeout("location.reload(true);",timeoutPeriod); } // --> 

删除Response.End()并让响应在ASP.NET生态系统中自然结束。

如果这不起作用,我会build议将button放在一个单独的<form> ,并将所需的数据发送到单独的HTTP处理程序。 设置HTTP处理程序以导出XML而不是网页。

我有同样的问题。 对aspx页面上的Button Click事件执行简单的Response.Writer(“”)函数永远不会触发。

课堂上的方法:

 public test_class() { public test_class() { } public static void test_response_write(string test_string) { HttpContext context = HttpContext.Current; context.Response.Clear(); context.Response.Write(test_string); context.Response.End(); } } 

ASPX页面:

 protected void btn_test_Click(object sender, EventArgs e) { test_class.test_response_write("testing...."); } 

当我试图find原因时,我只是在Page_Load事件上调用了相同的函数。

 protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { test_class.test_response_write("testing...."); } } 

调查这个问题,我发现那个aspx页面的主页是在<asp:UpdatePanel>之下的。

我删除它,它在Button_Click事件。 我build议你也检查一下。