Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core 7
В приложении ASP.NET Core MVC мы также можем использовать систему маршрутизации, которая работает в целом в ASP.NET Core и основные принципы которой были рассмотрены в предыдущих темах, в частности, здесь. В частности, в рамках MVC мы также можем использовать два подхода к определению системы маршрутизации. Первый представляет определение и использование конечных точек с помощью компонентов EndpointRoutingMiddleware и EndpointMiddleware и встраивающих их методов UseRouting и UseEndpoints. Данный подход применяется по умолчанию, когда, например, мы создаем новый проект для MVC. Второй подход предполагает использование RouterMiddleware и метода UseMvc. Далее мы рассмотрим оба подхода.
Чтобы задействовать систему маршрутизации на основе конечных точек в приложении MVC, нам надо добавить в классе Startup в методе ConfigureServices()
сервисы фреймворка
MVC и с помощью соответствующего middleware в методе Configure()
определить как минимум один маршрут:
public class Startup { public Startup(IConfiguration configuration) { // код конструктора } public IConfiguration Configuration { get; set; } public void ConfigureServices(IServiceCollection services) { services.AddControllersWithViews(); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // ... остальной код app.UseRouting(); // Подключение EndpointRoutingMiddleware app.UseAuthorization(); // Подключение EndpointMiddleware app.UseEndpoints(endpoints => { // определение маршрутов endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); }); } }
Как и в целом в ASP.NET Core, в MVC по умолчанию для определения системы маршрутизации используется связка EndpointRoutingMiddleware и EndpointMiddleware.
В частности, в классе Startup метод app.UseRouting()
добавляет в конвейер обработки запроса компонент EndpointRoutingMiddleware,
который определяет конечную точку, которая будет обрабатывать текущий запрос. А метод app.UseEndpoints
встраивает компонент EndpointMiddleware,
который определяет набор конечных точек, которые будут сопоставляться с определенными маршрутами и будут обрабатывать соответствующие маршрутам входящие запросы.
Метод app.UseEndpoints
в качестве параметра принимает объект IEndpointRouteBuilder, который добавляет
конечные точки. Для добавления маршрута, который будет сопоставляться с конечными точками, применяется метод MapControllerRoute().
Он определяет один маршрут:
endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}");
Параметр name
определяет название маршрута - оно произвольно и в данное случае имеет значение "default". А параметр pattern
определяет шаблон маршрута, с которым будут сопоставляться входящие маршруты.
Шаблон маршрута использует три параметра. Параметр "controller" будет сопоставляться по имени с одним из контроллеров приложения, а параметр "action" - с действием этого контроллера. Например, при запросе http://localhost:3456/Home/Index система выберет для обработки запроса контроллер Home - имя контроллера без префикса Controller и его действие Index.
Данный тип маршрутизации еще называют Convention-Based Routing, то есть маршрутизация, основанная на условностях в определениях маршрутов.
Для добавления маршрутов в MVC мы можем применять следующие методы IEndpointRouteBuilder:
MapControllerRoute() определяет произвольный маршрут и принимает следующие параметры:
MapControllerRoute(string name, string pattern, [object defaults = null], [object constraints = null], [object dataTokens = null])
Его параметры:
name
: название машрута
pattern
: шаблон машрута
defaults
: значения параметров маршрутов по умолчанию
constraints
: ограничения маршрута
dataTokens
: определения токенов маршрута
Первые два параметра являются обязательными, остальные необязательные.
MapDefaultControllerRoute() определяет стандартный маршрут, фактически эквивалентен вызову
endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}");
Поскольку это довольно часто используемое определение маршрута, то для него и был введен отдельный метод.
MapAreaControllerRoute() определяет маршрут, который также учитывает область приложения. Имеет следующие параметры:
MapAreaControllerRoute(string name, string areaName, string pattern, [object defaults = null], [object constraints = null], [object dataTokens = null])
Обязательный параметр areaName
позволяет определить область, с которой будет связан маршрут.
MapControllers() сопоставляет действия контроллера с запросами, используя маршрутизацию на основе атрибутов. Про атрибуты маршрутизации будет сказано в последующих статьях.
MapFallbackToController() определяет действие контроллера, которое будет обрабатывать запрос, если все остальые определенные маршруты не соответствуют запросу. Принимает имя контроллера и его метода:
MapFallbackToController(string action, string controller)
Определение шаблонов маршрутов, использование ограничений, необязательных параметров и параметров по умолчанию в MVC будет происходить также, как и уже было рассмотрено на примере ASP.NET Core в целом. Единственное существенное отличие состоит в том, что MVC добавляет поддержку атрибутов маршрутизации, которые мы далее рассмотрим.
Мы можем получить в контроллере все параметры маршрута, используя объект RouteData:
public IActionResult Index() { var controller = RouteData.Values["controller"].ToString(); var action = RouteData.Values["action"].ToString(); return Content($"controller: {controller} | action: {action}"); }