在 Response.End() 后关闭窗口?

3
我正在使用下面的代码下载Excel文件。一旦运行Response.End()调用,我想关闭窗口。然而,这并没有发生。请看下面我已经写好的代码。
'Write it back to the client

   Dim filename As String = "FullExtract_" & Now.Year.ToString & Now.Month.ToString & Now.Day.ToString & ".xlsx"
   Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
   Response.AddHeader("content-disposition", "attachment;  filename=" & filename)
   Response.BinaryWrite(pck.GetAsByteArray())
   Response.End()
   'cursor not reaching to below code   
   Page.ClientScript.RegisterStartupScript(Me.GetType(), "closedownload", "JavaScript:window.close(); return false;")

如何关闭窗口?


当您调用 Response.End 时,它会停止页面的执行,因此它不会进一步处理页面。请查看此链接:http://msdn.microsoft.com/en-us/library/system.web.httpresponse.end.aspx。 - Lukasz M
有没有关闭窗口的建议? - James123
4个回答

1
不要调用Response.End。这会抛出ThreadAbortException异常,导致各种不良后果。此外,该异常是导致Response.End之后的Page.ClientScript无法触发的原因。因此,只需删除Response.End即可。它已经不再需要,是旧的经典ASP时代的遗留问题。
编辑:您不能这样关闭窗口;当您发送文件进行下载时,应在用户操作系统上打开文件保存提示,并下载文件。我认为,html RegisterStartupScript将成为文件下载的一部分。您应该让触发下载的按钮或链接所在的页面使用target="_blank"或通过javascript打开一个新窗口,该窗口将自动关闭或根本不会打开,具体取决于浏览器。

我移除了 Response.End(),现在控制权已经传递到 Page.ClientScript.RegisterStartupScript,但是窗口没有关闭。看起来那段代码没有生效。 - James123

1
我遇到了类似的问题,请查看下面的答案,希望能帮到你。
var popupWindow = window.open("endpoint","","setting");
var att = document.createAttribute("onblure");  // Create a "onblure" attribute
att.value = "window.close()";                  // Set the value of the class attribute
popupWindow.setAttributeNode(att); 

这将允许在下载窗口出现时关闭窗口。
注意: endpoint:是您的新窗口终点。 setting:是您的窗口设置,例如宽度、高度、顶部、左侧等。

0

首先,我认为您的“关闭窗口脚本”应该像下面这样↓

Page.ClientScript.RegisterStartupScript(this.GetType(), "closedownload", "<script language='javascript'>window.opener=null;window.close();</script>");

我认为为什么在response.end()之后无法关闭窗口与ASP.NET LIFE CYCLE有关。

从上面的文档中,我们可以学习到以下顺序:

页面加载 -> 控件事件 -> 页面呈现

1、当您的页面已呈现时,您注册的JavaScript将被执行。

2、当您在事件中执行Response.End()(这将绝对停止页面生命周期的执行)时,页面呈现事件将永远不会触发。

3、这就是为什么在Response.End()之后无法关闭窗口的原因。我的看法。


0

调用Response.End()会停止页面的执行,因此注册脚本的行将不被处理。然而,我认为在将文件内容发送到浏览器后应该调用Response.End()以便它正确接收文件。

为了关闭窗口但允许文件下载,您可以尝试使用JavaScript显示一个弹出窗口,然后关闭它,同时保留其父页面打开。

这里有一些类似问题的解决方案建议:


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