TGViewer
.NET Разработчик .NET Разработчик @netdeveloperdiary · 6.76K subscribers
Post #1536 1.6K
День 1239. #ЗаметкиНаПолях
Привязка Модели из Нескольких Источников в Один Класс в
ASP.NET Core
Допустим, у нас есть следующий метод действия в ASP.NET API:
public IActionResult Post(
[FromBody]
RequestBody body,
[FromHeader(Name = "Accept")]
string accept,
[FromHeader(Name = "X-Correlation-Id")]
string correlationId,
[FromQuery(Name = "filter")]
string filter)
{
// какая-то обработка
return Ok();
}

Мы хотели бы объединить все параметры в один класс, PostRequest, вместо того чтобы использовать кучу разных. Создадим класс, который будет хранить все наши данные:
public class PostRequest
{
[FromBody]
public RequestBody Body { get; set; };

[FromHeader(Name = "Accept")]
public string Accept { get; set; };

[FromHeader(Name = "X-Correlation-Id")]
public string CorrelationId { get; set; };

[FromQuery(Name = "filter")]
public string Filter { get; set; };
}

public class RequestBody
{
public string SomeString { get; set; };
public bool SomeBool { get; set; }
}

Изменим наш метод действия, чтобы он принимал наш тип:
[HttpPost]
public IActionResult Post(PostRequest req)
{
// просто возвращаем объект
return new OkObjectResult(req);
}

Теперь, если мы попытаемся вызвать наш метод действия:
POST
Accept: application/json
X-Correlation-Id: my-correlation-id

https://localhost:7001/home?filter=one

{"someString": "Some string", "someBool": true}

Мы получим следующее сообщение об ошибке:
{
…
"title": "One or more validation errors occurred.",
"status": 400,
"errors": {
"Body": ["The Body field is required."],
"Accept": ["The Accept field is required."],
"filter": ["The Filter field is required."],
"X-Correlation-Id": ["The CorrelationId field is required."]
}
}

По умолчанию ASP.NET Core не осуществляет привязку модели из различных источников к одному классу. Чтобы изменить это поведение, нужно настроить ApiBehaviourOptions в методе ConfigureServices:
services.Configure<ApiBehaviorOptions>(options =>
{
options.SuppressInferBindingSourcesForParameters = true;
});

Теперь, выполнив тот же запрос, что и раньше, мы получим правильный ответ:
{
"body": {
"someString": "Some string",
"someBool": true
},
"accept": "application/json",
"correlationId": "my-correlation-id",
"filter": "one"
}

Источник: https://josef.codes/model-bind-multiple-sources-to-a-single-class-in-asp-net-core/
  • 👍 29
More from @netdeveloperdiary
  1. Oct 14, 2026Post #3373
  2. Oct 13, 2026День 2813. #ЗаметкиНаПолях #Async Ещё Раз Про Async/Await в C#. Часть 1 1. Почему существу…
  3. Oct 12, 2026День 2812. #Карьера #AI Как Разработчикам Оставаться Полезными, Когда Код Пишет ИИ? По мер…
  4. Oct 11, 2026День 2811. #ВопросыНаСобеседовании Марк Прайс предложил свой набор из 60 вопросов (как тех…
  5. Oct 10, 2026День 2810. #ЧтоНовенького #VSCode Более Быстрый и Лёгкий C# Dev Kit Мы, разработчики, люби…
  6. Oct 9, 2026День 2809. #Карьера 5 Навыков, Которые Помогут Быстрее Стать Сеньором. Окончание Начало 3.…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →