2008-12-17 56 views
2

在我的代码中,我使用JavaScript在ASPX页面上触发window.open()事件。 I'm在Page_Load()事件此页的输出文件:将文件写入响应后关闭弹出窗口

Response.Clear(); 
Response.ClearContent(); 
Response.ClearHeaders(); 
Response.Charset = ""; 
Response.ContentType = "application/octet-stream"; 
Response.AddHeader("Content-Disposition", "attachment;filename=\"" + filename + "\";"); 
outputStream.WriteTo(Response.OutputStream); 
outputStream.Flush(); 
outputStream.Close(); 
Response.Flush(); 
Response.Close(); 

后来我想关闭这个弹出窗口。但是因为我改变了我的回复类型,所以我无法在JavaScript中执行window.close()。它只会附加到提供给用户的文件中。这个线程是最合适的来源,我发现解决我的问题:

Closing window after export to excel

但给出的答案不帮我,所以我基本上卡住。我不想告诉用户手动关闭窗口。你知道如何实现我的目标吗?

回答

0

Daniel,

您可以从AJAX页面上传文件。你需要做的是在后面的代码中添加控件的ID到Update Panel Post back触发器,这需要回发。如果控件位于同一页面上,则不会有任何问题。但是,如果您使用具有按钮或另一个需要回发的webcontrol的用户控件,则必须通过USer控件的公共属性公开此控件的标识,并让包含页面检索此标识并将其添加为回发扳机。

请让我知道你是否需要这方面的帮助。

感谢, PRASHANT Kumbhat

+0

这会很好,但我没有使用标准的asp.net UpdatePanel。 – Daniel 2009-03-19 10:41:22

0

一个选择,我在过去使用的是生火的下载请求到一个隐藏的iframe,而不是弹出窗口,通过一些JavaScript:

var Utils = Utils || {}; 
Utils.download = function(url) { 
    var iframe = $("<iframe/>").hide().appendTo("body").load(function() { 
     iframe.remove(); 
    }).attr("src", url); 
}; 

这样你就不用担心任何可见的弹出窗口。唯一的缺点是,如果文件下载失败,用户根本不知道出了什么问题(而在你的情况下,他们仍然会弹出一个窗口,并显示错误信息)。要解决此问题,请不要返回文件,而要返回包含某些JavaScript的页面,该页面会在加载时触发某种类型的警报,以通知用户错误。

另请注意,从内存中调用加载iframe的函数并不适用于所有(任何?)浏览器,但在一天结束时它并不重要,因为最坏的情况是只是结束了一堆附在dom末尾的空iframe,这不应该引起任何问题(并且如果这是一个问题,您可以始终保持重用同一个iframe,而不是创建新的iframe)。

0

Daniel,

您错过了这一点。要关闭弹出窗口,您必须使用脚本管理器来执行此操作,因为您正在从UpdatePanel中触发Upload。因此,注册这样的脚本:

ScriptManager.RegisterStartupScript(UpdatePanelObject, UpdatePanelObject.GetType(), "scripname","your script here", true); 

希望其帮助你!

0

我会建议你通过一个简单的

<a href="/path/to/your/page.aspx" target="_blank">Download</a> 

这将调用你的网页在不同的窗口发射的文件下载,下载将开始和页面应该自动关闭。