C# 在回发后开始文件下载

C# 在回发后开始文件下载,c#,jquery,asp.net,gridview,download,C#,Jquery,Asp.net,Gridview,Download,在我的应用程序中,我正在构建一个zip文件,供用户下载一些导出的数据库信息。当用户单击“生成数据”按钮,我将请求记录在数据库中时,就会创建zip文件 在我的页面上,我有一个Gridview,它显示了用户的下载历史,还提供了在一段时间内下载最新生成的文件的能力 我遇到的问题是,当他们单击按钮时,我希望页面刷新(从而刷新gridview并显示他们的最新请求),然后为他们启动文件下载(即,显示提示,让他们决定是否打开/保存/取消) 我可以在回帖上开始下载,但是我的Gridview在开始之前没有更新,所

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

在我的页面上,我有一个Gridview,它显示了用户的下载历史,还提供了在一段时间内下载最新生成的文件的能力

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

我可以在回帖上开始下载,但是我的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(我在他们单击按钮构建文件时设置了true),则该方法在Page_Load事件中作为最后一项被调用

我还尝试通过jQuery/AJAX调用来刷新页面和开始下载,但收效甚微。我曾考虑过打开一个模式对话框,让他们点击一个链接开始下载,然后在模式关闭时刷新页面,但如果我找不到其他解决方案,这是最后的办法


非常感谢您的帮助

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

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

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

  • 请求文件时,显示页面的内容不会更改,它只会弹出浏览器的“保存”对话框。

    问题是您不会将页面发送回用户。用户单击按钮,该按钮会发送HTTP请求,您会为该请求生成包含要下载文件的HTTP响应。如果您愿意刷新页面,只有在向他发送要下载的文件之后,您才需要发送一个正常的回发结果(不调用
    BeginDownload
    方法),然后以某种方式强制他执行另一个请求,然后您用文件响应该请求

    这里有多种选择:

    • 在页面上包含标签
    • 使用一个加载JavaScript
    • 使用iframe
    • …或者让用户单击链接,如您所说

    所有方法都有其缺点(尤其要注意IE的“不想要的下载”保护,在某些情况下,这可能会令人讨厌),您可能至少应该包含一个带有“如果下载没有自动启动,请单击此处”的下载链接。)

    我确实在gridview中建立了一个下载链接,因此,如果gridview无法自行启动或他们错误地取消,他们仍然可以下载该文件,因为它存储在服务器上。谢谢你的建议,我一定会仔细研究一下,看看哪一个效果最好。我同意我可能一下子做得太多了。谢谢你的建议,我会看看我能做些什么,然后在这里选择一个最有效的解决方案!我以前研究过使用计时器的javascript方法,但我没有尝试只在需要时直接发送函数。我会检查这个选项。谢谢你的建议!