Содержание
В системе маршрутизации на основе соглашений, да и, в принципе, во всей маршрутизации важнейшую роль играет шаблон маршрута. В этой части мы подробно рассмотрим различные маршруты и их действие в приложении 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.




