Чтобы связать контроллеры MVC и их действия с запросами применяется система маршрутизации. Чтобы задействовать систему маршрутизации для контроллеров MVC, можно использовать различные способы. Например, определим в проекте ASP.NET Core в файле Program.cs следующий код:
var builder = WebApplication.CreateBuilder(args); // добавляем поддержку контроллеров с представлениями builder.Services.AddControllersWithViews(); var app = builder.Build(); // устанавливаем сопоставление маршрутов с контроллерами app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); app.Run();
Здесь для добавления маршрута, который будет сопоставляться с методами контроллеров, у объекта IEndpointRouteBuilder (в качестве которого выступает объект WebApplication) вызывается метод MapControllerRoute(). Он определяет один маршрут:
app.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() определяет стандартный маршрут, фактически эквивалентен вызову
app.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 class HomeController : Controller { public string Index() { var controller = RouteData.Values["controller"]; var action = RouteData.Values["action"]; return $"controller: {controller} | action: {action}"; } }