Содержание
В системе маршрутизации на основе соглашений, да и, в принципе, во всей маршрутизации важнейшую роль играет шаблон маршрута. В этой части мы подробно рассмотрим различные маршруты и их действие в приложении ASP.NET Core MVC.
Параметры маршрута
Вновь вернемся к стандартному маршруту нашего приложения, шаблон которого выглядит следующим образом:
{controller=Home}/{action=Index}/{id?}
этот шаблон состоит из трёх сегментов, каждый из которых — это параметр маршрута. Каждый параметр маршрута обязательно имеет имя и заключается в фигурные скобки. Таким образом мы имеем три параметра: controller
, action
и id
.
Для параметра controller
определено значение по умолчанию — Home
. Это имя контроллера (класс HomeController
). Аналогичным образом, для параметра action установлено значение по умолчанию — Index
, которое определяет действие (метод) в контроллере, которое должно выполняться. Третий параметр — id
является необязательным, о чем свидетельствует знак ?
после названия параметра.
Таким образом, система маршрутизации в нашем приложении будет действовать, исходя из того, какие сегменты шаблона будут задействованы в запросе. Ниже в таблице представлены возможные варианты запросов по стандартному маршруту:
Путь | Параметры запроса |
http://localhost[:port]/ |
|
http://localhost[:port]/Home |
|
http://localhost[:port]/Foo |
|
http://localhost[:port]/Foo/Bar |
|
http://localhost[:port]/Foo/Bar/5 |
|
При необходимости мы можем задавать шаблон с любым количеством сегментов. Например, определим такой маршрут:
app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}/{format?}");
здесь мы задали четвертый сегмент шаблона — необязательный параметр маршрута format
.
Статические сегменты
Статические сегменты никак не связываются с параметрами маршрута. Например,
app.MapControllerRoute( name: "api_default", pattern: "api/{controller=Home}/{action=Index}/{id?}/{format?}");
первый сегмент — статический. Чтобы запрос соответствовал этому шаблону он должен обязательно содержать в первом сегменте строку api
. Статические сегменты удобно использовать, например, если ваше приложение предоставляет какие-то дополнительные возможности: по умолчанию пользователь работает с графическим интерфейсом, но, при использовании запроса со статическим сегментам api в ответ приходят JSON-объекты с данными.
Значения параметров маршрута по умолчанию
Значения параметров по умолчанию можно прописывать непосредственно в шаблоне маршрута, как это показано выше, а можно использовать параметр defaults
метода MapControllerRoute()
. Этот параметр представляет объект, свойства которого соответствуют параметрам маршрута в котором имя свойства — это имя параметра маршрута, а значение свойства — значение по умолчанию для параметра. Например, определим следующий маршрут:
app.MapControllerRoute( name: "default", pattern: "{controller}/{action}", defaults: new { controller="Home", action="Privacy"});
шаблон маршрута состоит из двух параметров каждому из которых присвоены значения по умолчанию в параметре defaults. То есть, при запуске приложения будет использоваться маршрут http://localhost/Home/Privacy
.
Более того, ничего не изменится в работе приложения даже, если мы создадим такой маршрут:
app.MapControllerRoute( name: "default", pattern: "{action}", defaults: new { controller="Home", action="Privacy"});
но, при этом, нам придётся все действия включать только в один контроллер HomeController
.
Ограничения параметров маршрута
Для параметров маршрута в MVC, также как и в базовом ASP.NET Core, можно устанавливать ограничения. Чтобы установить ограничение параметра маршрута мы можем действовать также, как и в базовом ASP.NET Core — указать ограничение непосредственно в шаблоне, например, так:
app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id:int?}");
здесь третий параметр id
сможет принимать только целочисленные значения, а, если пользователь введет, например, строку, то приложение выдаст ошибку 404:
Второй вариант установки ограничений на параметр маршрута — указать ограничения в параметрах метода MapControllerRoute()
:
app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}", constraints: new {id = new MaxRouteConstraint(99) });
здесь в параметре constraints
мы передали объект в котором указали, что для параметра маршрута id
устанавливается ограничение — значение параметра не должно превышать 99
. Запустим приложение и посмотрим на работу такого ограничения:
Итого
Шаблон маршрута играет важную роль в работе системы маршрутизации ASP.NET Core MVC. Шаблон маршрута, обычно, состоит из нескольких сегментов. Каждый сегмент может быть параметром маршрута или статическим. Для параметров маршрута мы можем задавать значения по умолчанию и ограничения как и в базовом ASP.NET Core.