Шаблоны AJAX в ASP.NET - Шаблон уникального URL-адреса

ОГЛАВЛЕНИЕ

Шаблон уникального URL-адреса

URL-адреса – это суть Интернета. Пользователи сохраняют избранные URL-адреса на будущее, следуют по URL-адресам к новому содержимому и используют URL-адреса для возвращения к предыдущему состоянию. С помощью AJAX и модели SPI приложение может выполнить ряд задач изнутри одного URL-адреса, а это угрожает подрубить центральную основу работы в Интернете: то, что отдельные состояния приложения идентифицируются отдельными URL-адресами.

Обозреватели создают свои кэши URL-адресов по мере перемещений пользователей. Но в случае AJAX многие операции не проходят через обозреватель и не кэшируются в списке посещенных URL-адресов, на основе которого работают меню «Назад» и «Вперед». С другой стороны, клиентские обозреватели не предоставляют программной модели для добавления URL-адресов к списку с помощью кода JavaScript. Объектная модель обозревателя предоставляет лишь методы для перемещения назад и вперед внутри существующего списка.

Шаблон уникальных URL-адресов назначает уникальный и выразительный URL-адрес каждому значительному состоянию приложения. Например, если пользователь щелкает для изменения значения на странице AJAX, новый URL-адрес должен быть добавлен к кэшу обозревателя, хотя операция и была произведена через XMLHttpRequest внутри одной страницы.

Изменить URL-адрес без перезагрузки страницы можно при помощи следующего кода JavaScript:

window.location.hash = stateInfo;

Этот код добавляет к URL-адресу фрагмент с префиксом #, как показано ниже:

http://www.contoso.com/shopping.aspx#edit-1234

При использовании этого шаблона URL-адрес реально изменяется при запуске любой конкретной операции AJAX, что позволяет обозревателю отслеживать изменения в состоянии приложения.

Однако дело не сводится к простой записи URL-адреса. Когда обозреватель направляется на URL-адрес на основе хэш-кода, он сперва загружает основной URL-адрес, а затем ищет фрагмент страницы с кодовым именем. В контексте AJAX кодовое имя указывает не на фрагмент реальной страницы, а на относящуюся к приложению информацию, представляющую текущее состояние. Например, edit-1234 может означать, что изменяется элемент с идентификатором, равным 1234. Конкретный формат целиком управляется программистом.

Если обозреватель не может найти верный фрагмент, он просто игнорирует хэш-код в URL. Как следствие, у пользователя загружается страница, но не обязательно в ожидаемом состоянии приложения. Необходим второй фокус. Следует перехватить событие onload страницы, проанализировать URL-адрес, извлечь хэш-код и выполнить код JavaScript, необходимый для помещения страницы в желаемое состояние, вот так:

window.onload = function() {
  checkAndParseURL();
}
 
checkAndParseURL() {
  var state = window.location.hash;
  restorePage(state);

Похожий подход применяется в поддержке журнала, имеющейся в расширениях ASP.NET 3.5. Получить дополнительные сведения об этом можно по адресу quickstarts.asp.net/3-5-extensions/ajax. Решение в расширениях ASP.NET 3.5 полностью интегрировано в платформу. Его можно увидеть в форме новых свойств и событий, добавляемых к элементу управления ScriptManager. Но в итоге оно остается реализаций шаблона уникальных URL-адресов.

Вдобавок, следует обратить внимание, что фокус, основанный на хэш-коде в URL-адресе, не работает в Internet Explorer®, поскольку Internet Explorer не распознает изменения хэш-кода для URL-адреса, кроме как для встроенных кадров. На самом деле, у всех обозревателей есть свои особенности в обработке перехода по фрагментам (см. weblogs.asp.net/bleroy/archive/2007/09/07/how-to-build-a-cross-browser-history-management-system.aspx, чтобы получить дополнительные сведения по этой теме). Решение в расширениях ASP.NET 3.5 разбирается с этими особенностями, что и позволяет квалифицировать его как независимое от обозревателя.