【问题标题】:Browser back button loads old page with old javascript浏览器后退按钮使用旧 javascript 加载旧页面
【发布时间】:2020-07-05 19:28:35
【问题描述】:

第1页有按下按钮时的流动代码逻辑

If MyDataIsValid() Then
    ScriptManager.RegisterStartupScript(me, me.GetType(), "PopUp", "", False)
    Response.Redirect("~/Page2", false)
Else
    ScriptManager.RegisterStartupScript(me, me.GetType(), "PopUp", <some js for a popup>, False)
End If

如果我第一次按下按钮并且数据无效,那么将显示弹出窗口。 第二次使用有效数据,页面重定向到 Page2。 如果我通过按浏览器上的后退按钮向后导航,将显示弹出窗口。这就是问题所在,弹出窗口会错误地告诉我我的数据不正确。

我知道我可以在 Page2 上创建一个按钮来将我重定向到 Page1,但我也希望浏览器的后退按钮能够正常工作。

当使用浏览器后退按钮向后导航时,Page1 中的 Load 事件不会运行。页面加载我第一次按下按钮时的缓存页面。

我试过了

Response.Cache.SetCacheability(HttpCacheability.NoCache)

Response.Buffer = true
Response.CacheControl = "no-cache"
Response.AddHeader("Pragma", "no-cache")
Response.Expires = -1441

所以页面不会缓存但它不起作用。页面不会在浏览器的后退按钮处重新加载。

【问题讨论】:

  • 它与缓存没有任何关系,通过注册启动脚本并执行回发,您将内联(注入)脚本呈现到页面中。编辑:后退按钮确实拉出一个缓存页面,但它不是客户端请求和服务器响应场景。
  • 您可能应该在这个弹出脚本中引入条件检查,在这个后退按钮场景中抑制它。类似于检查以确保控件视图状态相同。您能提供&lt;some js for a popup&gt; 的样本和表格吗?另外,请添加适当的应用程序标签。我觉得这是一个网络表单,对吗?
  • @Brett Caswell:“后退按钮确实拉出一个缓存页面”,是的,但这是我第一次按下按钮时的页面,而不是第二次,当数据有效时。跨度>
  • 这里的区别是您没有获得与请求相关的缓存。后退按钮本质上是从上一个\最后一个响应加载下载的页面。具有无条件执行的内联脚本的响应。
  • @BrettCaswell,正确。问题是如何删除内联脚本。如果我在重定向之前重置内联脚本不起作用。

标签: javascript asp.net vb.net webforms


【解决方案1】:

这是您的解决方案: 在将路由重定向到另一个页面之前将脚本设置为空白/无。

Private Sub WebForm1_PreLoad(sender As Object, e As EventArgs) Handles Me.PreLoad
    If Session.Item("Script") IsNot Nothing Then
        ScriptManager.RegisterStartupScript(Me, Me.GetType(), "PopUp", "<script type='text/javascript'>" & CStr(Session.Item("Script")) & "</script>", False)
    End If
End Sub


Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    If MyDataIsValid() Then
        Session.Item("Script") = ""
        Response.Redirect("~/Page2.aspx")
    Else
        Session.Item("Script") = "alert('Script is running')"
        ScriptManager.RegisterStartupScript(Me, Me.GetType(), "PopUp", "<script type='text/javascript'>" & CStr(Session.Item("Script")) & "</script>", False)
    End If
End Sub

为避免浏览器缓存页面,请按如下方式通过 Javascript(客户端)处理其历史记录。

Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    If MyDataIsValid() Then

        Session.Item("Script") = ""
        Response.Redirect("~/Page2.aspx")

    Else

        Dim sbScript As StringBuilder = New StringBuilder()
        sbScript.AppendLine("( function () {   window.history.pushState(window.history.state, " &
                            " 'Not allowed', " &
                            " 'https://yourdomain.com/page2.aspx'); }()); ")

        ScriptManager.RegisterStartupScript(Me,
                                            Me.GetType(),
                                            "PopUp",
                                            "<script type='text/javascript'>" & sbScript.ToString & "</script>",
                                            False)

    End If

End Sub

但是,如果可能,请通过 Javascript 进行所有控件验证,因为客户端对浏览器的控制比服务器端更多

【讨论】:

  • @BrettCaswell,是的。你是对的,第一个解决方案并不是更好(它不能在所有浏览器中正常工作)。我已经用围绕该问题的下一个解决方案更新了答案
  • 是的,我认为这是一个解决方案。它与我在 cmets 中提到的有点不同(使用会话状态与控制视图状态),但我认为它更容易工作(并且可能更准确)。
  • 当按下浏览器的后退按钮时,页面不会从服务器重新加载。没有调用 WebForm1_PreInit 方法。
  • 使用 PreLoad 事件
  • @G3nt_M3caj 你不明白,服务器没有被调用。我尝试了所有这些,PreLoad、Load、PreInit。
猜你喜欢
  • 1970-01-01
  • 2010-10-24
  • 1970-01-01
  • 2020-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-17
相关资源
最近更新 更多