当文件下载完成后,我该如何修改页面?

4
我有一个简单的C# ASP.NET应用程序,它生成一个Excel文件并使用Response.WriteFile()函数将其发送到浏览器。我想在提交按钮被点击后禁用它,并在屏幕上显示一条等待几分钟的消息,因为某些文件可能需要一段时间来生成。这个功能非常好,但是我无法弄清如何在文件下载完成后重新激活按钮,甚至刷新页面。即使完成后,页面仍处于禁用状态,“请等待...”状态。
我认为同步的AJAX调用加上额外的javascript命令会起作用,但是虽然文件确实被生成,但从未发送到浏览器。我还尝试使用iframe控件,但找不到任何可靠的方法来确定新文件何时在其中加载完毕。
提前感谢任何能够帮助我的人!
更新:我在http://code.msdn.microsoft.com/AjaxFileDownload上找到了一个可能的解决方案,适用于下载已经存在的文件,但是当我调用生成文件并以Response.End()结束的页面时,“Finished Downloading”事件从未触发。

1
你无法通过JavaScript知道文件何时“下载完成”。这取决于浏览器。至于服务器何时“生成完成”,那么Stephen的解决方案就足够了。 - Andre Pena
尝试类似于这个的东西。 - Greg
3个回答

4
我会这样做:让页面生成一个令牌,并将该令牌与请求一起发送到服务器以生成Excel文件。当服务器收到令牌时,将其放入数据库中的表中,一旦文件完成服务,它就会删除令牌。同时,在此过程中,页面上有一个定期执行的进程(查看JS计时器),异步调用服务器以检查数据库中是否存在令牌。当服务器最终告诉页面“否”时,您就知道可以重新启用页面并隐藏“请稍候…”消息。

1
这是一个有趣的解决方案,但似乎为了对UI进行轻微增强而付出了相当多的工作和开销。 - Chris McGrath
在我看來,根據所描述的任務,這將是實現起來最簡單且需要進行最少更改的解決方案。 - Stephen Wrighton
Stephen,我知道你几年前已经回答过这个问题,但是你认为我们应该如何识别这个事件:“文件传输完成后”? - Jon z
看看 ASYNCHRONOUS HANDLERS (http://msdn.microsoft.com/en-us/library/ms227433%28v=vs.85%29.aspx)。它们是为这些长时间运行的进程而设计的。 - Stephen Wrighton

1

更新:我在http://code.msdn.microsoft.com/AjaxFileDownload找到了一个可能的解决方案,可以很好地下载已经存在的文件,但是当我调用生成文件并使用Response.End()完成的页面时,“完成下载”事件永远不会触发。

它不支持流式下载。您需要创建临时文件并将临时文件推送到浏览器,希望这有助于处理生成的文件。仅当浏览器端可用的cookie值时,结束下载事件才会触发。

谢谢,

Raj


0

我可能会将您生成并返回文件的代码转换为Web服务,并使用jQuery或asp.net Ajax库进行调用... 使用jquery,它可能看起来像:

//open your dialog box here

那么

$.ajax({
   type: "POST",
   url: "yourwebservice.asmx",
   data: "yourdata",
   success: function(){
     //close your dialog box
   }
 });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接