Confused with FromBody in ASP.NET Core

前端 未结 3 615
礼貌的吻别
礼貌的吻别 2020-12-18 18:23

I have the following WEB API method, and have a SPA template with Angular:

[HttpPost]
public IActionResult Post([FromBody]MyViewModel model)
<
相关标签:
3条回答
  • 2020-12-18 19:04

    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.

    Microsoft documentation for the ApiController attribute

    0 讨论(0)
  • 2020-12-18 19:07

    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!

    0 讨论(0)
  • 2020-12-18 19:14

    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.

    0 讨论(0)
提交回复
热议问题