【问题标题】:Web form non-responsive after download下载后网页表单无响应
【发布时间】:2013-10-02 17:50:12
【问题描述】:

我在 ASP.NET (2.0) 中工作,我们有一个页面,用户可以在其中选择和下载一系列 zip 文件。通过使用 DotNetZip 库(可能与问题无关,但为了完整性而包含在内),我可以轻松地完成此操作。

用户检查了他们要下载的文件后,页面进行回发,在按钮点击事件处理程序中,我使用以下代码:

    Response.Clear();
    Response.BufferOutput = false; // false = stream immediately
    Response.ContentType = "application/zip";
    Response.AddHeader("content-disposition", "filename=FileRequest.zip");

    using (ZipFile zip = new ZipFile())
    {
        zip.AddFile(MapPath("/datafiles/fileToZip.pdf"), "");
        zip.Save(Response.OutputStream);
    }
    Response.Close();

这一切似乎都很好。用户点击按钮,弹出下载窗口,用户下载zip。一切都很好......

...直到他们决定要在页面上做其他事情。表单中的按钮不再响应。例如,如果我再次单击下载按钮,它什么也不做。如果我重新加载页面,我可以重复这个行为......它工作一次,然后什么都不做。

我不明白为什么浏览器不发送新请求。它不是“旋转”或以其他方式忙碌。我认为这可能是一个浏览器问题,但我在 IE 和 Firefox 中都重复了它,所以这似乎是我不理解的东西。奇怪的是,只有表单提交元素似乎没有响应。 Javascript 仍然有效,常规链接也是如此。

那么为什么会发生这种情况,我该如何解决呢?

【问题讨论】:

  • 似乎视图状态回发在页面上被破坏了。因为webforms中所有的按钮事件都是基于JS的。尝试在单独的窗口中返回 zip 内容,不要覆盖同一页面上的响应。

标签: asp.net browser download


【解决方案1】:

问题可能在于您返回;

   Response.ContentType = "application/zip";

一旦发送(连同实际内容),浏览器会认为它无事可做(我相信)。

您可能应该创建一个专门用于下载文件的新窗口,方法是将文件选择保存在会话参数(或等效参数)中并打开一个包含您的下载代码的弹出窗口。

这将使父页面处于合适的状态。

【讨论】:

    【解决方案2】:

    内容处置标头seems to be a discouraged solution。但是,如果您使用标准 重定向 到 zip 文件,则会出现 ASP.NET 表单没有响应的相同效果。

    我在“Response.Redirect to new window”问答中使用 Tančev Saša 的代码解决了非常类似的问题(服务器返回 *.csv 文件以供下载),效果很好。也许它可能会在某些浏览器中产生一些弹出警告,但我认为这是在下载站点中经常这样做的方式。

    【讨论】:

      猜你喜欢
      • 2016-01-18
      • 2010-12-13
      • 1970-01-01
      • 2013-12-05
      • 2014-07-20
      • 2012-05-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多