У меня есть следующий метод WEB API и шаблон SPA с Angular:
[HttpPost]
public IActionResult Post([FromBody]MyViewModel model)
Я подумал, основываясь на теме это, здесь нет необходимости использовать [FromBody]
, поскольку я хочу прочитать значение из тела сообщения, поэтому нет необходимости переопределять поведение по умолчанию, но, если я не использую [FromBody]
, модель, исходящая от Angular, равна нулю. Я действительно сбит с толку, зачем мне использовать [FromBody]
, если я использовал поведение по умолчанию?
@Niladri ОК. Я знаю. Но почему?
Проверьте ссылку, данную Стивеном ниже ... это связано с привязкой модели json в .NET Core. Для строки запроса вы должны использовать [FromQuery]
с httpget.
В ASP.NET Core 2.1 этот атрибут может быть необязательным, если ясно, что этому параметру в сообщении назначено тело.
Вопрос, на который вы ссылаетесь, относится к 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
Значит ли это, что мне нужно добавить [ApiController] в любой маршрут O_o, это так много! (
Я все это искал! Спасибо. У меня есть проект .NET Core Web API 3.1, и я не добавлял [ApiController] в свой контроллер. Тогда мне понадобилось [FromBody]. Добавлен [ApiController], теперь он работает без [FromBody].
Я должен тебе целый день! Ты спас меня !!
Это не так. Это связано с тем, какой тип содержимого используется. Чтобы правильно привязать JSON в ASP.NET Core, вы должны изменить свое действие, включив в параметр атрибут [FromBody]. Это указывает инфраструктуре использовать заголовок типа содержимого запроса, чтобы решить, какой из настроенных IInputFormatters использовать для привязки модели. andrewlock.net/model-binding-json-posts-in-asp-net-core
Вы должны использовать
[FromBody]
, если вы используете HttpPost со своей стороны angular, чтобы вызвать api в .net Core