如何在执行响应之前显示/隐藏面板.重定向
本文关键字:隐藏 重定向 显示 执行 响应 | 更新日期: 2023-09-27 17:47:47
我有一个启动响应的表单。完成后重定向以下载文件。我还想在重定向发生之前隐藏表单并显示一个"谢谢"面板,但是asp.net引擎似乎只是进行重定向,而没有执行以下代码中的2项任务:
if (success)
{
lblSuccessMessage.Text = _successMessage;
showMessage(true);
}
else
{
lblSuccessMessage.Text = _failureMessage;
showMessage(false);
}
if(success)
Response.Redirect(_downloadURL);
知道我如何在重定向开始之前强制页面更新吗??
非常感谢Greg
您需要一些客户端代码来执行重定向。
我的偏好是嵌入一些javascript来进行重定向。
因此,隐藏表单,显示消息,并(在最粗略的级别上)使用文字控件向页面添加一些类似的文本。
<script>
location.href = "http://otherServerName/fileToDownload";
</script>
你可能会发现,这种重定向发生在你的页面更改显示之前——在这种情况下,请在HTML的body标签中尝试一下(注意不同类型的引号):
<body onload='location.href="http://otherServerName/fileToDownload";'>
请记住,每个post-back实际上都是向客户端提供一个新页面,而不仅仅是更改当前页面上的一些属性(即使ASP.NET试图假装它就像一个windows窗体)
就我个人而言,我更喜欢为流程的每个阶段都有一个单独的页面,而不是试图通过显示/隐藏不同的部分来在一个页面中完成所有事情——但我可能已经过时了。
编辑:如果他们禁用了javascript,你可以提供一个下载文件的链接。
您不能,因为此操作在发送回客户端之前发生在服务器上。如果你试图向用户发送文件,你可以使用Response.Write()将其流式传输给他们。这将使他们保持在当前页面上,这样你就可以向他们显示消息,他们就会得到下载提示。
缓冲区是文件的字节数组
Response.AddHeader("Content-disposition", "attachment; filename=" & myUserFriendlyFileName)
Response.ContentType = "application/octet-stream"
Response.OutputStream.Write(buffer, 0, buffer.Length)
直接在asp.net中你不能这样做,但一种方法是要么使用JS(如本文所述),要么使用IFrame加载要下载的文件-用户会看到谢谢,然后打开/保存对话框。。。
用javascript在客户端隐藏它,然后进行重定向,或者进行两次回发:第一次回发隐藏表单并显示感谢,第二次回发在屏幕上显示感谢后进行重定向。
或者,您可以执行javascript window.open,而不是在回发和表单隐藏完成后指向目标的重定向。
也许手动发送重定向头,等待几秒钟是你的选择?
Response.AddHeader("Redirect", "3; URL=" + _downloadURL")
编辑
再读一遍你的问题后,我可能有点误解了你。
您似乎想推迟整个过程,以便显示"谢谢"面板。这给你留下了两种可能性:
- 要么依赖JavaScript来显示面板,要么延迟表单POST。然后,服务器可以立即使用
Response.Redirect()
重定向。这是一种更现代的方式 - 或者您希望完全独立于JavaScript。在这种情况下,您必须使服务器在表单POST上显示一个中间的"谢谢,单击此处继续"页面,并通过
Response.AddHeader()
使用Redirect标头方法使该页面自动消失。这有点过时,但可靠
你不可能同时拥有这两者,因为对于那些关闭JavaScript的用户来说,这是不一致的
我最终通过abrudtkuh完成了这个建议,只是添加了一个指向成功消息的链接。。。我还将实现一个javascript重定向来自动启动下载,但我不想只依赖javascript,因此按钮会显示在页面上。
谢谢你的提示,大家好!
欢呼greg
if (success)
{
lblSuccessMessage.Text = _successMessage;
showMessage(true);
}
else
{
lblSuccessMessage.Text = _failureMessage;
showMessage(false);
}
if(success) {
Threading.Thread.Sleep(200)
Response.Redirect(_downloadURL);
}
您可以通过使线程休眠来强制它在重定向之前等待。
最好的、对用户最友好的选择是通过添加按钮让用户继续自己的操作。例如,您可以执行以下操作:
if (success)
{
lblSuccessMessage.Text = _successMessage + "<br /><INPUT TYPE='button' VALUE='Continue...' onClick='parent.location='" + _downloadURL + "'/>";
showMessage(true);
}
else
{
lblSuccessMessage.Text = _failureMessage;
showMessage(false);
}