6

我有一个表单,它启动 Response.Redirect 以在完成后下载文件。我还想在重定向发生之前隐藏表单并显示一个“谢谢”面板,但是似乎 asp.net 引擎只是在没有执行以下代码之前的 2 个任务的情况下进行了重定向:

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

                if(success)
                    Response.Redirect(_downloadURL); 

知道如何在重定向启动之前强制页面更新吗?

非常感谢格雷格

4

7 回答 7

2

您需要一些客户端代码来执行重定向。

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

因此,隐藏表单、显示消息并(在最粗略的层面上)使用文字控件将一些这样的文本添加到页面中。

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

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

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

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

就我个人而言,我更喜欢在流程的每个阶段都有一个单独的页面,而不是试图通过显示/隐藏各个位来在一个页面中完成所有事情 - 但我可能已经过时了。

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

于 2008-10-16T12:36:07.300 回答
1

也许手动发送重定向标头,等待几秒钟是适合您的方式?

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

编辑

再次阅读您的问题后,我可能对您有点误解。

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

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

您不能真正将两者结合起来,因为对于那些关闭 JavaScript 的用户来说,这将是不一致的。

于 2008-10-16T11:57:37.923 回答
1

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

缓冲区是文件的字节数组

Response.AddHeader("Content-disposition", "attachment; filename=" & myUserFriendlyFileName)
Response.ContentType = "application/octet-stream"
Response.OutputStream.Write(buffer, 0, buffer.Length)
于 2008-10-16T11:58:30.230 回答
1

直接在 asp.net 中你不能这样做,但一种解决方法是使用 JS(如在此处发布的那样),或者您可以使用加载要下载的文件的 IFrame - 用户将看到谢谢,然后打开/保存对话...

于 2008-10-16T12:43:15.070 回答
1

使用 javascript 将其隐藏在客户端,然后执行重定向,或者执行两次回发:第一次回发以隐藏表单并显示感谢,第二次在感谢被呈现到屏幕后进行重定向。

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

于 2008-10-16T12:50:22.857 回答
0

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

Thanks for the tips everybody - you all rock!

cheers greg

于 2008-10-17T02:16:26.567 回答
-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);
                }
于 2008-10-16T17:20:34.853 回答