Зачем нужен атрибут FromBody при ожидании данных в теле POST

Я могу отправить свои данные на сервер, но ТОЛЬКО, когда я использую атрибут FromBody.

Почему данные json автоматически не считываются из тела с помощью сообщения?

Backend web api

[HttpPost]
public async Task<IActionResult> Post([FromBody]CreateSchoolyearRequestDTO dto)
{

}

Фронтальные углы

this.createSchoolyear = function (schoolyear) {
  var path = "/api/schoolyears";
  return $http({
      url: path,
      method: "POST",
      data:  schoolyear,
      contentType: "application/json"
  }).then(function (response) {
      return response;
  });
};

Ответ 1

Просто потому, что что-то является запросом POST, нет четкого правила передачи аргументов. Запрос POST может содержать параметры запроса, закодированные в URL-адресе. Предполагается, что параметр метода будет параметром запроса для "простых" типов (строки, int и т.д.).

Обычно предполагается, что сложные типы будут объектами POST-формы. Стандартный запрос ASP.NET POST представляет собой форму submit, например. при входе в систему. Параметры в этом запросе обычно кодируются как application/x-www-form-urlencoded, в основном строка пар ключ/значение. Для сложных типов параметров, например. form view model objects, это считается по умолчанию.

Для всех других ситуаций, отличных от по умолчанию, вам нужно быть явным, откуда приходит параметр метода, как он передается в запросе. Для этой цели существует несколько различных атрибутов:

  • FromBodyAttribute - Для параметров, которые поступают из тела запроса
  • FromFormAttribute - Для параметров, которые поступают из одного поля данных формы
  • FromHeaderAttribute - для параметров, поступающих из поля заголовка HTTP
  • FromQueryAttribute - для параметров, которые исходят из аргумента запроса, закодированного в URL
  • FromRouteAttribute - параметры, которые поступают из данных маршрута
  • FromServicesAttribute - параметры, для которых услуги должны быть введены на уровне метода