在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。
不用说,你在做什么应该工作。 我已经成功地做了类似的过去,虽然我用了一个中继器和LinkButtons。
我唯一能看到的不同是你使用的是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议你也检查一下。