如何在执行响应之前显示/隐藏面板.重定向

本文关键字:隐藏 重定向 显示 执行 响应 | 更新日期: 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);
                }