Маршрутизация

Добавление маршрутизации

Последнее обновление: 24.03.2022

Чтобы связать контроллеры 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}";
    }
}
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850