Как ASP.NET Core связывает данные HTTP-запроса с параметрами метода контроллера?

«Как ASP.NET Core связывает данные HTTP-запроса с параметрами метода контроллера?» — вопрос из категории ASP.NET Core, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Этот процесс называется привязкой модели (Model Binding). Платформа автоматически извлекает данные из различных частей запроса и преобразует их в аргументы метода действия.

Источники данных (в порядке приоритета по умолчанию):

  1. [FromBody]: Тело запроса (для JSON, XML). Используется системой форматирования ввода (Input Formatter), например, System.Text.Json.
  2. [FromForm]: Данные формы (application/x-www-form-urlencoded или multipart/form-data).
  3. [FromRoute]: Значения из шаблона маршрута (например, {id} в [HttpGet("api/products/{id}")]).
  4. [FromQuery]: Параметры строки запроса (после ? в URL).
  5. [FromHeader]: Значения HTTP-заголовков.

Процесс:

  1. Платформа ищет источник для каждого параметра, используя атрибуты или соглашения (например, сложные объекты по умолчанию берутся из тела).
  2. Сопоставляет имена свойств (регистронезависимо) с ключами в данных запроса.
  3. Преобразует строковые значения в целевые типы (int, DateTime, Guid и т.д.).

Пример с явным указанием источников:

[HttpGet("products/{id}/reviews")] // id берется из маршрута
public IActionResult GetReviews(
    int id, // Из маршрута
    [FromQuery] int page = 1, // Из query-строки: ?page=2
    [FromHeader(Name = "X-Sort-Order")] string sortOrder = "asc") // Из заголовка
{
    // ... логика действия
}

[HttpPost]
public IActionResult CreateProduct([FromBody] ProductDto product) // Из тела запроса (JSON)
{
    // ...
}

Валидация: После привязки автоматически выполняется валидация модели (если тип помечен атрибутами [Required], [Range] и т.д.). Невалидная модель приводит к ответу 400 Bad Request с деталями ошибок.