回发后启动文件下载

在我的应用程序中,我正在为用户构建一个zip文件,以便下载一些导出的数据库信息。 当用户单击“生成数据”按钮并在数据库中记录请求时,将创建zip文件。

在我的页面上,我有一个Gridview,它显示用户的下载历史记录,并使他们能够在一段时间内下载最新生成的文件。

我遇到的问题是当他们点击按钮时,我想要刷新页面(从而刷新gridview并显示他们的最新请求),然后为他们启动文件下载(IE,提示提示并让他们决定是否打开/保存/取消它)。

我可以在post上开始下载,但我的Gridview在它开始之前没有更新,所以它没有显示列表中的最新请求。 如何在下载提示开始之前更新gridview?

我正在使用以下内容开始下载:

public void BeginDownload() { FileDownload download = InventoryService.GetLastThreeFileDownloads(this.EmployeeId).First(); FileInfo fi = new FileInfo(Server.MapPath(SERVER_DOWNLOAD_PATH) + download.DownloadFileName); Response.Clear(); Response.ContentType = "application/zip"; Response.AppendHeader("Content-Disposition", "attachment; filename=" + fi.Name); Response.TransmitFile(fi.FullName); Response.Flush(); } 

如果隐藏字段设置为true(我在单击按钮构建文件时设置),则在Page_Load事件中调用该方法作为最后一项。

我也试过通过jQuery / AJAX调用来刷新页面并开始下载但收效甚微。 我已经考虑打开一个modal dialog,让他们点击一个链接开始下载,然后在模态关闭时刷新页面,但如果我找不到另一个解决方案,这是最后的选择。

任何帮助是极大的赞赏!

问题是你不要将页面发回给用户。 用户单击发送HTTP请求的按钮,您将为其生成包含要下载的文件的HTTP响应。 如果你想刷新页面,只有在那之后向他发送要下载的文件,你需要发送一个正常的回发结果(不要调用BeginDownload方法),然后以某种方式强迫他做另一个请求,你回复与文件。

这里有各种选择:

  • 在页面上包含元刷新标记
  • 使用onload JavaScript
  • 使用iframe
  • …或者让用户点击链接,如你所说。

所有方法都有其缺点(尤其要注意IE的“不需要的下载”保护,在某些情况下,这可能很烦人),你应该至少包含一个下载链接“如果下载没有自动启动,请点击这里” 。)

以下是我之前做过类似事情的方式:

  1. 在回发(生成数据)时,使用gridview中的最新数据发回更新的页面。
  2. 添加一个小的javascript函数,该函数在页面完成加载时执行,并请求生成的文件(类似于window.location='fileurl';当然只在回发时发送此javascript函数。

请求文件时显示页面的内容不会改变,只需弹出浏览器的保存对话框即可。

听起来你想要立刻做太多事情。 我建议回发更新gridview,然后使用重定向到新的专用页面(或ashx处理程序)来下载文件。 当您在下载页面/ ashx处理程序中使用content-disposition标头时,gridview页面应保持可见。