2009-12-18 35 views
4

我有一个简单的C#ASP.NET应用程序,它可以生成一个Excel文件并使用Response.WriteFile()函数将其发送到浏览器。文件完成下载到浏览器后,如何修改页面?

我想一旦被点击禁用提交按钮,并在屏幕上显示一条消息,等待几分钟,因为某些文件可能需要一段时间才能产生。这很好,但我无法弄清楚如何在文件完成下载后重新激活按钮,甚至刷新页面。即使完成,页面仍处于禁用状态,“请稍候...”状态。

我想到了一个同步AJAX调用额外的JavaScript命令后会工作,不过虽然文件确会产生的,它从来没有发送给浏览器。我也尝试使用iframe控件,但无法找到任何方式可靠地知道新文件何时完成加载。

在此先感谢任何人谁可以帮助!

更新:我在http://code.msdn.microsoft.com/AjaxFileDownload找到了一个可行的解决方案,它非常适合下载已存在的文件,但是当我调用生成该文件并以Response.End()结束的页面时,“Finished Downloading”事件从不触发。

+1

你无法通过JavaScript知道这个文件是 “完成下载” 的时候。这是浏览器。至于服务器“完成生成”,那么Stephen的解决方案就够公平了。 –

+0

尝试类似[this](http://stackoverflow.com/a/4168965/585552) – Greg

回答

4

我会做到这一点的方式是,我会在页面生成令牌,并发送所述令牌到服务器生成excel文件的请求一起。

当服务器获得令牌,它扔它到一个表在数据库中,一旦文件完成了服务,它会删除令牌。现在

,而这一切正在发生的事情,有网页,其中常规(看看JS定时器)上的进程要求服务器(异步调用),如果在数据库中存在的令牌。当服务器最终告诉页面“否”时,您知道您可以重新启用该页面并隐藏“请稍候...”消息。

+1

这是一个有趣的解决方案,但似乎有相当多的工作和开销只是为了对UI进行小的改进。 –

+0

国际海事组织,与所述的任务,这将是最简单的解决方案实施与最少数量的变化。 –

+0

斯蒂芬,我知道你回答了这些年前,但你如何提出我们认识到这一事件: “一旦文件已完成送达” –

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 
    } 
}); 
1

UPDATE:我发现了一个可能的解决方案在http://code.msdn.microsoft.com/AjaxFileDownload,对下载已经存在的文件的伟大工程,但是当我调用生成文件和到Response.End用(完成)的网页时, “完成下载”事件从不开火。

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

感谢,

拉吉

相关问题