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

3

在我的代码中,我使用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

您可以在 AJAX 页面上上传文件。需要做的是在代码后端将控件的 ID 添加到更新面板回发触发器中,该触发器需要回发。如果控件在同一页面上,则不会有任何问题。

但是,如果您使用一个具有按钮或另一个需要回发的 Web 控件的用户控件,则必须通过用户控件的公共属性公开此控件的 ID,并让包含页面检索此 ID 并将其添加为回发触发器。


可以这样做,但我没有使用标准的asp.net UpdatePanel。 - Daniel

0
你没有理解重点。要关闭弹出窗口,必须使用脚本管理器来执行此操作,因为你是从UpdatePanel触发Upload。所以像这样注册脚本:
ScriptManager.RegisterStartupScript(UpdatePanelObject, UpdatePanelObject.GetType(), "scripname","your  script here", true);

0
我建议您通过简单的方式下载文件。
<a href="/path/to/your/page.aspx" target="_blank">Download</a>

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


1
Firefox... 就是 Firefox。它不会关闭下载窗口。 - AliFurkan

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加载时调用iframe.remove()并不适用于所有(任何?)浏览器,但归根结底,这并不重要,因为最坏的情况下,你只会得到一堆空的iframes附加到dom的末尾,这不应该引起任何问题(如果这是一个问题,你总是可以继续重复使用同一个iframe而不是创建新的)。


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