Маршрутизация в ASP.NET Core MVC. Маршрутизация на основе соглашений

В системе маршрутизации на основе соглашений, да и, в принципе, во всей маршрутизации важнейшую роль играет шаблон маршрута. В этой части мы подробно рассмотрим различные маршруты и их действие в приложении ASP.NET Core MVC.

Параметры маршрута

Вновь вернемся к стандартному маршруту нашего приложения, шаблон которого выглядит следующим образом:

{controller=Home}/{action=Index}/{id?}

этот шаблон состоит из трёх сегментов, каждый из которых — это параметр маршрута. Каждый параметр маршрута обязательно имеет имя и заключается в фигурные скобки. Таким образом мы имеем три параметра: controller, action и id.

Для параметра controller определено значение по умолчанию — Home. Это имя контроллера (класс HomeController). Аналогичным образом, для параметра action установлено значение по умолчанию — Index, которое определяет действие (метод) в контроллере, которое должно выполняться. Третий параметр — id является необязательным, о чем свидетельствует знак ? после названия параметра.

Таким образом, система маршрутизации в нашем приложении будет действовать, исходя из того, какие сегменты шаблона будут задействованы в запросе. Ниже в таблице представлены возможные варианты запросов по стандартному маршруту:

Путь Параметры запроса
http://localhost[:port]/
  • controller = Home
  • action = Index
http://localhost[:port]/Home
  • controller = Home
  • action = Index
http://localhost[:port]/Foo
  • controller = Foo
  • action = Index
http://localhost[:port]/Foo/Bar
  • controller = Foo
  • action = Bar
http://localhost[:port]/Foo/Bar/5
  • controller = Foo
  • action = Bar
  • id = 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.

Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии