ASP.NET MVC 4
Адам Фриман
Введение в URL паттерны
Система маршрутизации использует набор роутов. Эти маршруты совместно составляют URL схему приложения, являющуюся набором URL-адресов, которые ваше приложение будет распознавать и на которые будет реагировать.
Нам не нужно вручную набирать отдельные URL, которые мы будем поддерживать. Вместо этого каждый роут содержит URL паттерн, который сравнивается с входящим URL. Если паттерн соответствует URL, тогда его использует система маршрутизации для обработки этого URL. Давайте начнем с URL для нашего приложения:
http://mysite.com/Admin/Index
URL-адреса могут быть разбиты на сегменты. Это части URL, исключая хост и строку запроса, разделенные символом «/». В URL из примера есть два сегмента, как показано на рисунке 13-2.
Рисунок 13-2: Сегменты URL из примера
Первый сегмент содержит слово Admin
, а второй сегмент содержит слово Index
. Для нас очевидно, что первый сегмент относится к контроллеру, а второй сегмент – к действию. Но, конечно, мы должны выразить эти отношения таким образом, чтобы система маршрутизации могла это понять. Вот URL паттерн, который делает это:
{controller}/{action}
При обработке входящего запроса работа системы маршрутизации заключается в том, чтобы запрошенный URL подходил паттерну, а также в извлечении значения из URL для переменных сегмента, определенных в шаблоне. Сегментные переменные выражаются при помощи фигурных скобок ({}
). Например, в паттерне есть две сегментные переменные с именами controller
и action
, и поэтому значение сегментной переменной controller
будет Admin
, а значение переменной сегмента action
будет Index
.
Мы указываем на соответствие a паттерну, потому что в MVC приложении, как правило, есть несколько роутов, и система маршрутизации сравнивает входящий URL с URL паттерном каждого роута, пока не найдет соответствия.
Примечание
Система маршрутизации не имеет специальных знаний о контроллерах и действиях. Она просто извлекает значения для сегментных переменных и передает их по каналу запросов. А затем в канале обработки запросов, если запрос достигает MVC фреймворка, это значение присваивается переменным
controller
иaction
. Именно поэтому система маршрутизации может быть использована с Web Forms и Web API (Web API рассматривается в главе 25).
По умолчанию URL паттерн будет соответствовать любому URL, который имеет правильное количество сегментов. Например, паттерн {controller}/{action}
будет соответствовать любому URL, который имеет два сегмента, как показано в таблице 13-1.
Таблица 13-1: Подходящие URL
URL запроса | Переменные сегмента |
http://mysite.com/Admin/Index |
controller = Admin , action = Index |
http://mysite.com/Index/Admin |
controller = Index , action = Admin |
http://mysite.com/Apples/Oranges |
controller = Apples , action = Oranges |
http://mysite.com/Admin |
Нет соответствий: слишком мало сегментов |
http://mysite.com/Admin/Index/Soccer |
Нет соответствий: слишком много сегментов |
В таблице 13-1 выделены два ключевых вида поведения URL паттернов:
- URL паттерны консервативны: они будут соответствовать только тем URL, которые имеют одинаковое число сегментов, что и нужный паттерн. Вы можете увидеть это в четвертом и пятом примерах в таблице.
- URL паттерны либеральны. Если URL имеет правильное количество сегментов, паттерн извлечет значение для сегментной переменной, каким бы оно ни было.
Это поведение по умолчанию, которые являются ключом к пониманию того, как работают URL паттерны. Мы покажем вам, как изменить настройки по умолчанию, далее в этой главе.
Как мы уже упоминали, система маршрутизации ничего не знает об MVC приложении, поэтому URL паттерн найдет соответствие, даже если нет контроллера и действия, которые подходят значениям, извлеченным из URL. Мы показали это во втором примере в таблице 13-1. Мы поменяли сегменты URL Admin
и Index
, поэтому и значения, извлекаемые из URL, также меняются местами, хотя в примере нет никакого контроллера Index
.