在将文件写入响应后关闭弹出窗口

时间:2008-12-17 13:43:13

标签: c# asp.net response

在我的代码中,我使用JavaScript在ASPX页面上发起window.open()事件。我在此页面的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

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

4 个答案:

答案 0 :(得分:0)

丹尼尔,

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

如果您需要更多帮助,请与我们联系。

谢谢, Prashant Kumbhat

答案 1 :(得分:0)

我过去使用的一个选项是通过一些javascript将下载请求发送到隐藏的iframe而不是弹出窗口:

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

这样您就不必担心任何可见的弹出窗口。唯一的缺点是如果文件下载失败,用户就不会得到任何错误的提示(而在你的情况下,他们仍然有弹出窗口,错误信息完好无损)。若要解决此问题,而不是返回文件,返回包含一些javascript的页面,该页面在加载时触发某种警报以通知用户该错误。

另请注意,从内存中,iframe.remove() iframe的加载调用在所有(任何?)浏览器中都不起作用,但是在一天结束时它无论如何都不重要你最后会在dom的末尾添加一堆空的iframe,这些iframe不会引起任何问题(你可以继续重复使用同一个iframe,而不是创建新的iframe,如果这是一个问题)。

答案 2 :(得分:0)

丹尼尔,

你错过了这一点。要关闭弹出窗口,您必须使用脚本管理器来执行此操作,前提是您从UpdatePanel触发上载。所以注册脚本如下:

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

希望对你有所帮助!

答案 3 :(得分:0)

我建议您通过简单的

解压缩文件
<a href="/path/to/your/page.aspx" target="_blank">Download</a>

这将在不同的窗口中调用您的页面,下载将开始,页面应自动关闭。