Маршрутизация в ASP.NET Core MVC

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core 7

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

В приложении ASP.NET Core MVC мы также можем использовать систему маршрутизации, которая работает в целом в ASP.NET Core и основные принципы которой были рассмотрены в предыдущих темах, в частности, здесь. В частности, в рамках MVC мы также можем использовать два подхода к определению системы маршрутизации. Первый представляет определение и использование конечных точек с помощью компонентов EndpointRoutingMiddleware и EndpointMiddleware и встраивающих их методов UseRouting и UseEndpoints. Данный подход применяется по умолчанию, когда, например, мы создаем новый проект для MVC. Второй подход предполагает использование RouterMiddleware и метода UseMvc. Далее мы рассмотрим оба подхода.

Маршрутизация в MVC с помощью конечных точек

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