我在网上看到几篇帖子抱怨 Firefox 在重定向后维护历史 url 哈希。这是我希望的行为 - 它发生在 Firefox (11.0)、Chrome (18.0) 和 Opera (11.61) 中,但不是 IE (9) 或 Safari (5.1.2)。
在我的页面上,我设置并运行了 ASP.NET 4.0 历史记录点(已经工作了几年)。我还将一些查询字符串参数传递给页面。我现在要做的是检查新查询字符串参数的值,如果它与我的期望不匹配,则使用更新的值重定向到同一页面。我正在使用这种机制来跟踪浏览器的各个选项卡的会话,以便当它们在多个选项卡中打开相同的页面时,会话值不会从一个选项卡到另一个选项卡。
无论如何,我的一切工作正常,包括使用 ASP.NET 历史记录点的后退/前进 - 当我访问书签并且查询字符串参数不匹配时,我重定向并更改查询字符串参数以跟踪会话,以及历史状态是在书签的 url 然后用于将页面重新加载到我想要的状态。但这仅适用于 Firefox、Chrome 和 Opera。不是 IE,它对我来说很重要(仅基于我们的用户群),而不是 Safari。
我已经确定除了(或者可能是因为)不存在 url 历史状态这一事实之外,在 IE 或 Safari 中重定向后不会调用 ScriptManager.Navigate。
是否有我可以在 ScriptManager 上或在重定向期间设置的设置/选项以维护 url 中的历史状态? 如果历史状态在 url 中,如果需要,我可以直接调用 ScriptManager.Navigate,但值不存在于 url 中。
如果它有帮助,这里列出了我在哪里进行检查和重定向。然后将 ReportRunID 附加到每个选项卡需要唯一的会话变量键。我保留了以前 ReportRunID 的列表以跟踪并清除它们(在某个时间段之后,或者遇到超过 [MAX] 个 id 时),这样我就不会因为这些会话条目而使服务器内存过载。
Private Sub Page_PreInit(sender As Object, e As System.EventArgs) Handles Me.PreInit
If IsPostBack = False Then
Dim rrid As String = Request.QueryString("RRID")
If ReportRunIDExists(rrid) = False Then
ReportRunID = Now.ToString("_HHmmssfff")
Dim url As String = Request.Url.PathAndQuery
If String.IsNullOrEmpty(rrid) Then
Response.Redirect(String.Format("{0}&RRID={1}", url, _reportRunID))
Else
Dim idx As Integer = url.IndexOf("&RRID=")
Response.Redirect(String.Format("{0}&RRID={1}{2}", url.Substring(0, idx), _reportRunID, url.Substring(idx + 6 + rrid.Length)))
End If
End If
End If
End Sub
Private Sub Page_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreRender
'save current RRID/Page/Time to session
UpdateSessionReportRunID(_reportRunID)
End Sub
...
如果我的书签网址看起来像:
mysite.com/mypage.aspx?Rpt=123&RRID=_095224678#&&state1=abc&state2=def...
在重定向后的 FF/Chrome/Opera 中,我的网址如下所示:
mysite.com/mypage.aspx?Rpt=123&RRID=_102176253#&&state1=abc&state2=def...
但是在重定向后的 IE/Safari 中,我的 url 看起来像:
mysite.com/mypage.aspx?Rpt=123&RRID=_102176253
有任何想法吗?