代码之家  ›  专栏  ›  技术社区  ›  Charles Okwuagwu

将Json对象反序列化到“web api”中的奇怪行为

  •  0
  • Charles Okwuagwu  · 技术社区  · 6 年前

    我有以下WEB API方法,并有一个带有角度的SPA模板:

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

    我想,基于 this 主题,没有必要使用 [FromBody] 在这里,因为我想从消息体中读取值,所以没有必要重写默认行为,但是,如果我不使用 ,来自Angular的模型为空。我真的很困惑,我为什么要用 [从正文] ,因为我使用了默认行为?

    0 回复  |  直到 7 年前
        1
  •  13
  •   Community CDub    4 年前

    对于任何看到这个问题的人.NETCore3-你需要添加[ApiController]到你扩展ControllerBase的控制器中。 只有在使用MVC控制器时才需要[FromBody]。

    这会导致身体以你期望的方式被自动处理。

    Microsoft documentation for the ApiController attribute

        2
  •  11
  •   user3559349 user3559349    7 年前

    您链接到的问题是指web api。您使用的是核心mvc,它已经被重新编写,以便将以前的mvc和webapi版本的管道合并为一个 Controller

    过帐时 json (根据任命 x-www-form-urlencoded [FromBody] 属性来指示 ModelBinder IInputFormatter 用于读取请求。

    Model binding JSON POSTs in ASP.NET Core

        3
  •  0
  •   Tim Harker    5 年前

    这里有另一种方法,假设您需要同时支持这两种方法 [FromForm] [FromBody]

    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

    希望它能帮助别人!