Confused with FromBody in ASP.NET Core
For anyone seeing this issue .net core 3 - you need to add the [ApiController] to the controller where you extend ControllerBase.The [FromBody] is only needed if you're doing an MVC controller.
This causes the body to get automatically processed in the way you're expecting.
The question you linked to is referring to web-api. You are using core-mvc which has been re-written to merge the pipelines for the previous mvc and web-api versions into one Controller
class.
When posting json
(as apposed to x-www-form-urlencoded
), the [FromBody]
attribute is required to instruct the ModelBinder
to use the content-type header to determine the IInputFormatter
to use for reading the request.
For a detailed explanation of model binding to json in core-mvc, refer Model binding JSON POSTs in ASP.NET Core.
And here's an alternate approach assuming you need to support both [FromForm]
and [FromBody]
in your Controller APIā¦
Front-End (Angular Code):
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' } });}
Back-End (C# Code):
[AllowAnonymous][HttpPost("[action]")]public async Task<IActionResult> ForgotPassword(ForgotPasswordViewModel model) { }
Now your signature can remain the same so it can support both.
And another more permanent approach I thought about while addressing.
https://benfoster.io/blog/aspnet-core-customising-model-binding-conventions.
Hope it helps someone!