History.js を使用しbrowserstate
て Ajax 経由で子パネルを変更およびロードするカスタム jQuery コントロールがあります。HTML 5 ブラウザーでは、URL が完全に変更されているため、ページの更新が機能します (現在のパネルが読み込まれます)。
ただし、IE9 以前では、状態は次のようなハッシュ値として保存されます。
http://localhost:63559/ApplicationPanel/ListView#/SectionPanel/ListView/3?&_suid=1397574319099025255064889015816
/SectionPanel/ListView/3
内のハッシュ URL (例: )を抽出しOnActionExecuting
て、ページの更新時に正しい開始点にリダイレクトできるようにします (戻るボタンと進むボタンは正常に動作します)。
基本的にはこれを行いたいのですraw URL
が、ハッシュ部分も含まれていません。
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
var url = filterContext.HttpContext.Request.RawUrl;
if (url.Contains('#'))
{
url = url.Substring(url.IndexOf('#')+1);
filterContext.Result = Redirect(url);
}
base.OnActionExecuting(filterContext);
}
このコードをブレークポイントすると、URL には基本 URL (例: /ApplicationPanel/ListView
) のみが含まれます。
MVC コントローラでハッシュ パラメータを取得するにはどうすればよいですか? プッシュ方法も変更する必要があるかもしれませんが、次のいくつかのバリエーションは役に立ちませんでした。
// If HTML4, try adding a querystring
if (typeof window.history.pushState !== "function")
{
url = "?" + url;
}
this.Historyjs.pushState({ somedata: data }, "", url);
次のような URL を取得します。
http://localhost:63559/Level1#Level1/?/Level2/Index/3&_suid=139757562428301418756129738284
アップデート:
これは、History.js がブラウザーの URL を操作する方法にかかっているようです。HTML 4 ブラウザーでは、サーバーが余分なデータを認識しないように、ハッシュ タグのみを変更できます。
テストとして、プラグインにハッシュ URL をチェックさせ、ブラウザをそれにリダイレクトさせました。
// If HTML4, extract the URL from the hash
if (typeof window.history.pushState !== "function")
{
var hash = window.location.hash;
if (hash.length)
{
var q = hash.indexOf('?');
if (q < 1)
{
q = (hash.length);
}
hash = hash.substring(1, q);
window.location = hash;
}
}
これはページの更新には機能しましたが、残念ながらブラウザのページの読み込みでは、ページの再読み込みと戻るボタンが押されたことを区別できません。このコードは、戻るボタンを同じ子ページに何度も送信します。
助言がありますか?