【问题标题】:How to Show/Hide Panels before executing Response.Redirect如何在执行 Response.Redirect 之前显示/隐藏面板
【发布时间】:2008-10-16 11:53:41
【问题描述】:

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

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

                if(success)
                    Response.Redirect(_downloadURL); 

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

非常感谢 格雷格

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

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

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

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

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

    【讨论】:

    • 感谢 Robin...使用客户端 javascript 可以实现我所追求的,但我仍然需要编写代码以使其对没有启用 javascript 的用户可以访问...所以我仍然会需要写那个额外的页面,所以不幸的是它真的不会完成太多。似乎额外的页面是go.Thanks
    【解决方案2】:

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

    缓冲区是文件的字节数组

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

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

          编辑

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

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

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

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

          【讨论】:

            【解决方案6】:

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

            感谢大家的提示 - 你们都摇滚!

            干杯 格雷格

            【讨论】:

              【解决方案7】:
              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);
                              }
              

              【讨论】:

              • 不抱歉,这是错误的。服务器上的 Thread.Sleep 只是让服务器在重定向之前等待 200 毫秒。此外,在 asp.net 中混合代码和标记是不好的形式(即不要在字符串中创建控件)
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-05-12
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多