Опубликован: 30.01.2013 | Доступ: свободный | Студентов: 1292 / 162 | Длительность: 17:23:00
Теги: .net, ajax, asp, www, интранет
Лекция 6:

Построение приложений на основе шаблона "Model-View-Controller" с применением ASP.NET MVC Framework

Маршруты

Одним из наиболее важных программных компонентов ASP.NET MVC Framework является механизм маршрутизации. Он необходим для того, чтобы задать соответствие между используемым адресом в HTTP-запросе и контроллером (а также действием контроллера), который этот запрос должен обработать. Фактически, таблица маршрутов ASP.NET MVC Framework является входной точкой, с которой начинается обработка запроса в веб-приложении.

Таблица маршрутов представляет собой сопоставление шаблона адреса HTTP-запроса и контроллера, со всеми необходимыми параметрами. Для хранения таблицы маршрутов используется класс RouteCollection.

Обычно маршруты определяются в момент запуска приложения. Для этого создается обработчик события "ApplicationStart", в котором размещается соответствующий код. Для подписки на это событие и определение таблицы маршрутов обычно используется класс приложения Application, который определяется в файле "global.asax". Код определения стандартных маршрутов, который доступен при создании пустого проекта выглядит следующим образом.


Как видно, для определения маршрута используется метод MapRoute класса RouteCollection. Этот метод содержит набор необходимых параметров для определения маршрута:

  • имя маршрута;
  • шаблон адреса HTTP-запроса;
  • параметры запроса по-умолчанию;
  • ограничения маршрута.

Имя маршрута используется для генерации адреса, соответствующего этому маршруту в коде приложения (например, в представлении) для ссылки на другие ресурсы.

Шаблон адреса HTTP-запроса представляет собой строку, которая содержит именованные подстановочные фрагменты. Такие фрагменты заключаются в фигурные скобки, а их имя указывается внутри скобок. Значения, которые содержаться в адресе HTTP-запроса в соответствующих позициях являются параметрами, которые используются при обработке запроса. В приведенном выше примере такими фрагментами являются:

  • controller;
  • action;
  • id.

Например, в соответствии с приведенной выше таблицей маршрутов, запросы по адресу "/Home/List/1" будут переданы контроллеру с именем "Home", причем действие, которое обработает этот запрос будет называться "List", а также будет определен параметр "id". Далее, при рассмотрении механизма контроллера мы увидим, что параметр "id" можно определить как параметр метода контроллера; в этом случае значение из адреса HTTP-запроса будет передано в качестве значения параметра метода.

Следующий параметр метода MapRoute – значения по умолчанию. Для этих целей используется анонимный класс, содержащий переменное количество свойств. Значения свойств этого класса используются в том случае, если в адресе HTTP-запроса отсутствует соответствующий фрагмент. Например, при обращении к приложению, таблица маршрутов которого описана выше с адресом "/" будет использован контроллер с именем "Home", действие "Index", а параметр "Id" останется пустым. В случае отсутствия определений по-умолчанию, соответствующие фрагменты адреса HTTP-запроса необходимо определить явным образом.

Для определения таблицы маршрутов можно использовать несколько вызовов метода MapRoute. В этом случае для каждого контроллера можно определить собственный шаблон адреса HTTP-запроса. Например, можно изменить предыдущий код следующим образом.


В этом примере определено два маршрута. Например, обратившись к приложению по адресу "/list", обработка будет передана контроллеру "Data", и его действию "List"; при этом обратившись по адресу "/info/5" обработку будет осуществлять тот же контроллер "Data", но уже будет использоваться действие "Info". Аналогичным образом можно определить сколько угодно много маршрутов для приложения и для каждого задать свой контроллер и действие.

В последнем примере для маршрута с именем "Info" можно увидеть еще один дополнительный параметр при вызове метода MapRoute. Этот параметр – ограничение для фрагмента адреса, в данном случае для фаргмента "id". Это ограничение позволяет определить набор допустимых значений для фрагмента. В приведенном выше примере для задания ограничения используется регулярное выражение ("\d" означает что допустимы только цифры). Регулярные выражения – это один из наиболее распространенных методов задания ограничения. Как правило, его бывает достаточно для определения вида адреса HTTP-запроса. Однако если необходимо выполнить какую-то более сложную процедуру проверки можно создать собственный объект-ограничение.

Для создания объекта-ограничения для маршрута необходимо создать класс, реализующий интерфейс IRouteConstraint. После этого, в качестве ограничения при определении маршрута следует указать именно этот класс.


Реализация класса-ограничения является достаточно простой задачей. Как было сказано выше, для этого необходимо создать новый класс, который реализует интерфейс IRouteConstraint. Этот интерфейс содержит единственный метод Match, который вызывается в момент проверки на соответствие требованиям очередного адреса HTTP-запроса.


Внутри метода Match можно определить собственную логику задания ограничений для параметра. При этом этот метод содержит все необходимые параметры, которые могут потребоваться при обработке маршрута.

Как можно было увидеть, в предыдущих примерах кроме метода MapRoute используется также метод IgnoreRoute. Этот метод используется в тех ситуациях, когда нужно исключить из обработки определенный набор адресов. В этом случае среда ASP.NET MVC Framework будет игнорировать соответствующие адреса и их обработкой будут заниматься другие механизмы.

При поступлении очередного запроса HTTP таблица маршрутизации будет просматриваться последовательно. Это означает, что если текущий HTTP-запрос содержит адрес, который соответствует двум или более маршрутам, то сработает тот маршрут, который определен раньше. Этот факт демонстрируется следующим примером.


В данном примере видно, что для адреса "/list/5" соответствует одновременно два маршрута – "List" и "Home". Однако при обработке такого вида запроса предпочтение будет отдано первому маршруту, поскольку он определен раньше.

Таким образом, платформа ASP.NET MVC Framework содержит гибкий механизм определения схемы маршрутов. При желании, аналогичный механизм можно использовать при разработке приложений на основе ASP.NET Web Forms – в этом случае необходимо добавить ссылку на сборку "System.Web.Routing".

Краткие итоги

Платформа ASP.NET MVC Framework содержит важный инструмент – таблицу маршрутов. Эта таблица позволяет сопоставить схему адресов HTTP-запросов с конкретными контроллерами. Для этого используется механизм шаблонов адреса. Кроме того, в таблице маршрутов можно определить собственные ограничения для каждого фрагмента адреса.

Марина Воробьева
Марина Воробьева
Виктория Ткаченко
Виктория Ткаченко

Проигрыватель не работает. После нажатия кнопки Play ничего не происходит.