← Назад к вопросам

Как настраивают Routing в контроллере?

2.3 Middle🔥 191 комментариев
#ASP.NET и Web API

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Настройка маршрутизации в ASP.NET Core контроллерах

Маршрутизация в ASP.NET Core — это механизм сопоставления входящих HTTP-запросов с обработчиками (действиями контроллеров). Существует несколько подходов к настройке, которые можно комбинировать.

Основные подходы к маршрутизации

  1. Conventional Routing (Обычная маршрутизация)
  2. Attribute Routing (Маршрутизация с помощью атрибутов)
  3. Endpoint Routing (Маршрутизация конечных точек, появившаяся в ASP.NET Core 3.0+)

1. Conventional Routing (обычная маршрутизация)

Настраивается в классе Startup (или Program.cs в .NET 6+) с помощью шаблонов:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseRouting();
    
    app.UseEndpoints(endpoints =>
    {
        // Стандартный шаблон для контроллеров
        endpoints.MapControllerRoute(
            name: "default",
            pattern: "{controller=Home}/{action=Index}/{id?}");
            
        // Кастомный маршрут
        endpoints.MapControllerRoute(
            name: "products",
            pattern: "shop/{category}/{id:int}",
            defaults: new { controller = "Products", action = "Details" });
    });
}

Ключевые компоненты шаблона:

  • {controller} - имя контроллера (без суффикса "Controller")
  • {action} - имя метода действия
  • {id?} - опциональный параметр с вопросительным знаком
  • {id:int} - параметр с ограничением типа (только целые числа)

2. Attribute Routing (маршрутизация атрибутами)

Наиболее гибкий и современный подход. Атрибуты размещаются непосредственно на контроллерах и действиях:

Базовые атрибуты маршрутизации:

[Route("api/[controller]")]
[ApiController]
public class ProductsController : ControllerBase
{
    // GET api/products
    [HttpGet]
    public IActionResult GetAll() { /* ... */ }
    
    // GET api/products/5
    [HttpGet("{id:int}")]
    public IActionResult GetById(int id) { /* ... */ }
    
    // POST api/products
    [HttpPost]
    public IActionResult Create([FromBody] Product product) { /* ... */ }
    
    // PUT api/products/5
    [HttpPut("{id}")]
    public IActionResult Update(int id, [FromBody] Product product) { /* ... */ }
    
    // DELETE api/products/5
    [HttpDelete("{id:int:min(1)}")]
    public IActionResult Delete(int id) { /* ... */ }
}

3. Endpoint Routing (современная система)

В .NET Core 3.0+ используется система маршрутизации конечных точек, которая объединяет MVC, Razor Pages и другие компоненты:

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();

var app = builder.Build();

app.UseRouting();

app.MapControllers(); // Автоматически регистрирует маршруты из атрибутов

// Или настройка вручную:
app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();

Комбинирование подходов и расширенные возможности

Ограничения маршрутов (Constraints)

[Route("api/[controller]")]
public class OrdersController : Controller
{
    // Только целочисленный id
    [HttpGet("{id:int:min(1)}")]
    public IActionResult GetOrder(int id) { /* ... */ }
    
    // Только определенный формат даты
    [HttpGet("date/{date:datetime}")]
    public IActionResult GetByDate(DateTime date) { /* ... */ }
    
    // Сочетание нескольких ограничений
    [HttpGet("{id:int}/{status:regex(^(pending|completed|cancelled)$)}")]
    public IActionResult GetOrderWithStatus(int id, string status) { /* ... */ }
}

Именованные маршруты и генерация URL

[Route("blog")]
public class BlogController : Controller
{
    [HttpGet("posts/{slug}", Name = "blog_post")]
    public IActionResult Post(string slug) { /* ... */ }
    
    [HttpGet("archive/{year:int}/{month:int?}/{day:int?}")]
    public IActionResult Archive(int year, int? month, int? day) 
    {
        // Генерация URL для именованного маршрута
        var url = Url.RouteUrl("blog_post", new { slug = "my-post" });
        return Ok();
    }
}

Токены маршрутизации

Специальные токены упрощают поддержку маршрутов:

[Route("[controller]/[action]")] // Автоматически подставляются имена контроллера и действия
[Route("api/[controller]")] // "api/products" для ProductsController
[Area("[area]/[controller]")] // Поддержка областей

Порядок сопоставления маршрутов

ASP.NET Core использует определенный порядок:

  1. Более конкретные маршруты имеют приоритет над общими
  2. Атрибутивные маршруты имеют приоритет над обычными
  3. Порядок регистрации влияет при совпадении приоритетов

Рекомендации по настройке

  • Для Web API используйте Attribute Routing — он более читаем, удобен для рефакторинга и документирования
  • Гибридный подход: настройте "запасной" обычный маршрут в MapControllerRoute как default, а для API-эндпоинтов используйте атрибуты
  • Версионирование API: реализуйте через атрибуты маршрутизации: [Route("api/v1/[controller]")]
  • Ограничения маршрутов помогают валидировать входные данные на уровне маршрутизации
  • Именованные маршруты упрощают генерацию ссылок в коде

Пример комплексной настройки

// Startup.cs или Program.cs
app.UseEndpoints(endpoints =>
{
    // Области для админ-панели
    endpoints.MapAreaControllerRoute(
        name: "admin_area",
        areaName: "Admin",
        pattern: "Admin/{controller=Dashboard}/{action=Index}/{id?}");
    
    // API версионирование (обычная маршрутизация)
    endpoints.MapControllerRoute(
        name: "api_v1",
        pattern: "api/v1/{controller}/{action}/{id?}",
        defaults: new { area = "ApiV1" });
    
    // Запасной маршрут для MVC
    endpoints.MapControllerRoute(
        name: "default",
        pattern: "{controller=Home}/{action=Index}/{id?}");
});

// В контроллере
[Route("api/v{version:apiVersion}/[controller]")]
[ApiVersion("1.0")]
public class ModernApiController : ControllerBase
{
    [HttpGet("filter")]
    public IActionResult Filter([FromQuery] FilterModel filter)
    {
        // Современный подход с моделью привязки
        return Ok();
    }
}

Правильная настройка маршрутизации критически важна для производительности, безопасности и поддерживаемости приложения. Выбор подхода зависит от типа приложения (MVC, API, гибридное) и требований к гибкости и читаемости кода.