Как получить хеш-часть URL-адреса History.js из OnActionExecuting контроллера MVC
У меня есть пользовательский элемент управления JQuery, который использует History.js для изменения browserstate
и загрузите дочерние панели через Ajax. В браузерах HTML 5 URl полностью изменен, поэтому обновление страницы работает (загружает текущую панель).
Однако в IE9 и более ранних версиях состояние сохраняется в виде значения хеша, например:
http://localhost:63559/ApplicationPanel/ListView#/SectionPanel/ListView/3?&_suid=1397574319099025255064889015816
Я хочу извлечь хеш URL (например, /SectionPanel/ListView/3
) Внутри 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;
}
}
Хотя это и работало для обновления страницы, к сожалению, загрузка страницы в браузере не может различить перезагрузку страницы и нажатие кнопки "назад". Этот код отправляет кнопку "Назад" на одну и ту же дочернюю страницу снова и снова.
Какие-либо предложения?
1 ответ
Я пробовал разные варианты, но, похоже, ничто не решает всех ситуаций. В конце концов, я прибег к удалению любого хэша при загрузке страницы или нажатии кнопки "Назад", так как не всегда могу различить эти два.
Конечный результат:
- В браузерах HTML 4 кнопка "Назад" и перезагрузка вернутся на панель верхнего уровня (без ссылки на хэш).
- В HTML 5 он прекрасно работает с возвратом, пересылкой и обновлением, поддерживая текущую панель правильно на всех уровнях иерархии.
Код при запуске плагина jQuery
// If HTML4...
if (typeof window.history.pushState !== "function")
{
// If there is a hash, remove it and redirect (to clean up the address bar)
var hash = window.location.hash;
if (hash.length)
{
window.location = <any>window.location.pathname;
return;
}
}