Путать с FromBody в ASP.NET Core

У меня есть следующий метод WEB API и шаблон SPA с Angular:

[HttpPost]
public IActionResult Post([FromBody]MyViewModel model)

Я подумал, основываясь на теме это, здесь нет необходимости использовать [FromBody], поскольку я хочу прочитать значение из тела сообщения, поэтому нет необходимости переопределять поведение по умолчанию, но, если я не использую [FromBody], модель, исходящая от Angular, равна нулю. Я действительно сбит с толку, зачем мне использовать [FromBody], если я использовал поведение по умолчанию?

Вы должны использовать [FromBody], если вы используете HttpPost со своей стороны angular, чтобы вызвать api в .net Core

Niladri 09.06.2018 08:58

@Niladri ОК. Я знаю. Но почему?

user5032790 09.06.2018 08:59

Проверьте ссылку, данную Стивеном ниже ... это связано с привязкой модели json в .NET Core. Для строки запроса вы должны использовать [FromQuery] с httpget.

Niladri 09.06.2018 09:00

В ASP.NET Core 2.1 этот атрибут может быть необязательным, если ясно, что этому параметру в сообщении назначено тело.

Ray 09.06.2018 09:02
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
29
4
25 051
3

Ответы 3

Вопрос, на который вы ссылаетесь, относится к web-api. Вы используете core-mvc, который был переписан, чтобы объединить конвейеры для предыдущих версий mvc и web-api в один класс Controller.

При отправке json (в отличие от x-www-form-urlencoded) атрибут [FromBody] требуется, чтобы указать ModelBinder использовать заголовок типа содержимого для определения IInputFormatter, который будет использоваться для чтения запроса.

Подробное описание привязки модели к json в core-mvc см. В Привязка модели JSON POST в ASP.NET Core.

А вот альтернативный подход, предполагающий, что вам нужно поддерживать как [FromForm], так и [FromBody] в вашем API-интерфейсе контроллера ...

Фронтенд (угловой код):

forgotPassword(forgotPassword: ForgotPassword): Observable<number> {
  const params = new URLSearchParams();
  Object.keys(forgotPassword).forEach(key => params.append(key, forgotPassword[key]));
  return this.httpClient.post(`${this.apiAuthUrl}/account/forgotpassword`, params.toString(), { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } });
}

Серверная часть (код C#):

[AllowAnonymous]
[HttpPost("[action]")]
public async Task<IActionResult> ForgotPassword(ForgotPasswordViewModel model) { }

Теперь ваша подпись может оставаться прежней, поэтому она может поддерживать и то, и другое.

И еще один, более постоянный подход, о котором я думал при обращении.

https://benfoster.io/blog/aspnet-core-customising-model-binding-conventions.

Надеюсь, это кому-то поможет!

Для всех, кто сталкивается с этой проблемой .net core 3 - вам необходимо добавить [ApiController] к контроллеру, в котором вы расширяете ControllerBase. [FromBody] нужен только в том случае, если вы работаете с контроллером MVC.

Это заставляет тело автоматически обрабатывать так, как вы ожидаете.

Документация Microsoft для атрибута ApiController

Я видел одну и ту же проблему в двух проектах, есть ли что-то, что я пропустил в документации по миграции с 2.1 -> 2.2 -> 3.0 -> 3.1

Mathias Haugsbø 11.12.2019 14:55

Значит ли это, что мне нужно добавить [ApiController] в любой маршрут O_o, это так много! (

xSx 19.12.2019 16:37

Я все это искал! Спасибо. У меня есть проект .NET Core Web API 3.1, и я не добавлял [ApiController] в свой контроллер. Тогда мне понадобилось [FromBody]. Добавлен [ApiController], теперь он работает без [FromBody].

duyn9uyen 01.04.2020 23:43

Я должен тебе целый день! Ты спас меня !!

Onur Omer 29.12.2020 17:56

Это не так. Это связано с тем, какой тип содержимого используется. Чтобы правильно привязать JSON в ASP.NET Core, вы должны изменить свое действие, включив в параметр атрибут [FromBody]. Это указывает инфраструктуре использовать заголовок типа содержимого запроса, чтобы решить, какой из настроенных IInputFormatters использовать для привязки модели. andrewlock.net/model-binding-json-posts-in-asp-net-core

Daniel Frost 02.02.2021 19:15

Другие вопросы по теме