0

Firefoxがリダイレクト後に履歴URLハッシュを維持することを訴えるいくつかの投稿をオンラインで見ました。これは私が望んでいる動作です-Firefox(11.0)、Chrome(18.0)、Opera(11.61)で発生しますが、IEでは発生しません(9)またはSafari(5.1.2)。

私のページでは、ASP.NET 4.0の履歴ポイントが設定されて機能しています(数年間機能しています)。また、いくつかのクエリ文字列パラメータをページに渡します。私が今やろうとしているのは、新しいクエリ文字列paramの値を確認し、それが期待しているものと一致しない場合は、更新された値で同じページにリダイレクトすることです。私はこのメカニズムを使用してブラウザの個々のタブのセッションを追跡しているので、同じページが複数のタブで開いているときに、セッション値がタブからタブへと互いにステップしません。

とにかく、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

..。

ブックマークしたURLが次のようになっている場合:

mysite.com/mypage.aspx?Rpt=123&RRID=_095224678#&&state1=abc&state2=def...

リダイレクト後のFF/Chrome / Operaでは、私のURLは次のようになります。

mysite.com/mypage.aspx?Rpt=123&RRID=_102176253#&&state1=abc&state2=def...

しかし、リダイレクト後のIE / Safariでは、私のURLは次のようになります。

mysite.com/mypage.aspx?Rpt=123&RRID=_102176253

何か案は?

4

1 に答える 1

1

さらに検索した結果、History State ハッシュがサーバーに送信されていないことに気付きました。ブックマークに含まれるようにクエリ文字列に格納されますが、クライアント側のスクリプト マネージャーによってアクセスされるため、ポストバックによって状態値が読み込まれます。サーバーはクエリ文字列内のハッシュ値を認識しないため、ユーザーがそのページへのブックマークをたどったときにそれらの値を見つける方法がありません。

この問題は、さまざまなブラウザー タブのセッション状態を個別に追跡しようとしたときに発生しました。上記のコードでは、パラメーターが空または無効な場合、新しい値RRIDで自分自身にリダイレクトする必要があります。RRIDリダイレクトすると、IE と Safari の History State ハッシュが失われました (ただし、他のブラウザーでは失われません)。

私の回避策:

問題は、リダイレクトにハッシュ値を含める必要があることですが、それはサーバーからは利用できないため、ページに JavaScript を挿入して、ハッシュが利用可能なクライアントからリダイレクトを実行することにしました。

さまざまなシナリオで使用した Client Redirect 拡張ヘルパー メソッドが既にあり、それを変更して現在のハッシュ値を含めました。

<System.Runtime.CompilerServices.Extension()>
Public Sub ClientRedirect(ByVal Response As HttpResponse, ByVal url As String, Optional ByVal target As Target = Nothing, Optional ByVal windowFeatures As String = Nothing, Optional includeCurrentHash As Boolean = False)

    If IsNothing(target) Then
        If windowFeatures = String.Empty Then
            target = ResponseHelper.Target._self
        Else
            target = ResponseHelper.Target._blank
        End If
    End If

    Dim page As Page = CType(HttpContext.Current.Handler, Page)
    url = page.ResolveClientUrl(url)

    Dim script As String
    script = "window.open(""{0}"", ""{1}"", ""{2}"");"

    script = String.Format(script, url & If(includeCurrentHash, "#"" + window.location.hash + """, String.Empty), target.ToString, windowFeatures)
    If target = ResponseHelper.Target._self Then
        'execute after page has loaded
        page.ClientScript.RegisterStartupScript(GetType(Page), "Redirect_" & Now.ToString("HHmmssfff"), script, True)
    Else
        'execute as page is loading
        page.ClientScript.RegisterClientScriptBlock(GetType(Page), "Redirect_" & Now.ToString("HHmmssfff"), script, True)
    End If

End Sub

次に、リダイレクトを行う Page_PreInit で、現在のハッシュを含む ClientRedirect を実行するように変更し、目的の結果を得ました。つまり、
すべてのブラウザーで履歴状態のハッシュを維持しながらブラウザーをリダイレクトします。

    'redirect from the client so that we keep the History State URL hash 
    Response.ClientRedirect(String.Format("{0}&RRID={1}", Request.Url.PathAndQuery, _reportRunID), , , True)
于 2012-04-13T20:28:49.123 に答える