Как получить хеш-часть 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;
    }
}
Другие вопросы по тегам