如何在执行Response.Redirect之前显示/隐藏面板

时间:2008-10-16 11:53:42

标签: c# asp.net redirect response.redirect

我有一个表单,一旦完成就会启动一个Response.Redirect来下载文件。我还想在重定向发生之前隐藏表单并显示一个“谢谢”面板,但是在下面的代码中,似乎asp.net引擎只执行重定向而不执行2个任务:

if (success)
                {
                    lblSuccessMessage.Text = _successMessage;
                    showMessage(true);                        
                }
                else
                {
                    lblSuccessMessage.Text = _failureMessage;
                    showMessage(false);
                }

                if(success)
                    Response.Redirect(_downloadURL); 

任何想法如何在重定向开始之前强制页面更新?

谢谢堆 格雷格

7 个答案:

答案 0 :(得分:2)

您需要一些客户端代码才能进行重定向。

我的偏好是嵌入一些javascript来进行重定向。

因此,隐藏表单,显示消息,并(在最粗糙的级别)使用文字控件向页面添加这样的文本。

<script>
    location.href = "http://otherServerName/fileToDownload";
</script>

您可能会发现此重定向发生在您的网页更改显示之前 - 在这种情况下,请在HTML的正文标记中尝试此操作(请注意不同类型的引号):

<body onload='location.href="http://otherServerName/fileToDownload";'>

请记住,每次回帖实际上都是向客户端提供新页面,而不仅仅是更改当前页面上的某些属性(即使ASP.NET努力假装它就像Windows窗体一样)

我个人更喜欢为流程的每个阶段都有一个单独的页面,而不是通过显示/隐藏各个位来尝试在一个页面中执行所有操作 - 但我可能会毫无希望地过时。

编辑:如果他们已禁用javascript,您只需提供下载该文件的链接。

答案 1 :(得分:1)

也许手动发送一个重定向标题,等待几秒钟就可以了吗?

Response.AddHeader("Redirect", "3; URL=" + _downloadURL")

修改

再次阅读你的问题之后,我可能会误解你一点。

您似乎想要延迟整个过程,以便显示“谢谢”面板。这留下了两种可能性:

  • 您可以依靠JavaScript来显示面板并延迟表单POST。然后,服务器可以使用Response.Redirect()立即重定向。这是更现代的方式。
  • 或者您希望完全独立于JavaScript。在这种情况下,您必须使服务器在表单POST上显示中间的“谢谢,单击此处继续”页面,并通过Response.AddHeader()使用重定向标头方法使该页面自动消失。这有点过时但很可靠。

您实际上并不能将两者结合使用,因为对于那些关闭了JavaScript的用户而言,这将是不一致的。

答案 2 :(得分:1)

您不能,因为此操作在服务器发送回客户端之前发生。如果您尝试将文件发送给用户,可以使用Response.Write()将其传输给用户。这将使它们保持在当前页面上,以便您可以向他们显示消息,他们将获得下载提示。

buffer是文件的字节数组

Response.AddHeader("Content-disposition", "attachment; filename=" & myUserFriendlyFileName)
Response.ContentType = "application/octet-stream"
Response.OutputStream.Write(buffer, 0, buffer.Length)

答案 3 :(得分:1)

直接在asp.net中你无法做到这一点,但是一种方法是使用JS(如这里发布的),或者你可以使用加载文件的IFrame下载 - 用户将看到thankyou ,然后打开/保存对话......

答案 4 :(得分:1)

使用javascript隐藏客户端,然后执行重定向,或者执行两次回发:首先回发以隐藏表单并显示感谢信息,第二次执行重定向一旦感谢您已呈现屏幕。

或者,您可以执行javascript window.open,而不是在回发和表单隐藏完成后指向目标的重定向。

答案 5 :(得分:0)

我最后通过abrudtkuh做了一个建议,只是添加了一个成功消息的链接...我还将实现一个javascript重定向来自动开始下载,但我不想完全依赖于javascript,因此页面显示按钮。

感谢所有人的提示 - 你们都摇滚!

欢呼声 格雷格

答案 6 :(得分:-1)

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);
                }