【问题标题】:Confused with FromBody in ASP.NET Core与 ASP.NET Core 中的 FromBody 混淆
【发布时间】:2018-11-19 03:56:48
【问题描述】:

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

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

我认为,基于this主题,这里不需要使用[FromBody],因为我想从消息体中读取值,所以不需要覆盖默认行为,但是,如果我不使用[FromBody],来自 Angular 的模型为空。我真的很困惑,既然我使用了默认行为,为什么还要使用[FromBody]

【问题讨论】:

  • 如果你使用 HttpPost 从你的角度调用 .net Core 中的 api,你必须使用 [FromBody]
  • @Niladri 好的。我知道。但为什么呢?
  • 检查下面 stephen 给出的链接...这是由于 .NET Core 中的 json 模型绑定。对于查询字符串,您必须将 [FromQuery] 与 httpget 一起使用。
  • 在 ASP.NET Core 2.1 中,如果明确将正文分配给 Post 中的该参数,则此属性可能是可选的。

标签: c# angular asp.net-core asp.net-core-mvc asp.net-core-webapi


【解决方案1】:

对于看到此问题 .net core 3 的任何人 - 您需要将 [ApiController] 添加到您扩展 ControllerBase 的控制器中。 [FromBody] 仅在您使用 MVC 控制器时才需要。

这会导致正文以您期望的方式自动处理。

Microsoft documentation for the ApiController attribute

【讨论】:

  • 我在两个项目中看到了同样的问题,我在从 2.1 -> 2.2 -> 3.0 -> 3.1 的迁移文档中遗漏了什么
  • 这是否意味着我需要在任何路线中添加 [ApiController] O_o 太多了!(
  • 我一直在寻找这个!谢谢。我有一个 .NET Core Web API 3.1 项目并且没有将 [ApiController] 添加到我的控制器中。然后我需要[FromBody]。添加了 [ApiController] 现在它可以在没有 [FromBody] 的情况下工作。
  • 我欠你一整天!你救了我!!
  • 这是不正确的。它与使用的内容类型有关。为了在 ASP.NET Core 中正确绑定 JSON,您必须修改您的操作以在参数中包含属性 [FromBody]。这告诉框架使用请求的内容类型标头来决定使用哪个已配置的 IInputFormatter 来进行模型绑定。 andrewlock.net/model-binding-json-posts-in-asp-net-core
【解决方案2】:

这是另一种方法,假设您需要在 Controller API 中同时支持 [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.

希望对某人有所帮助!

【讨论】:

    【解决方案3】:

    您链接到的问题是指 web-api。您正在使用经过重新编写的 core-mvc,将以前的 mvc 和 web-api 版本的管道合并到一个 Controller 类中。

    当发布json(与x-www-form-urlencoded 相对)时,需要[FromBody] 属性来指示ModelBinder 使用内容类型标头来确定用于读取请求的IInputFormatter

    关于模型绑定到 core-mvc 中的 json 的详细解释,请参考Model binding JSON POSTs in ASP.NET Core

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-09
      • 1970-01-01
      • 2020-01-23
      • 2014-07-09
      • 1970-01-01
      • 2011-01-19
      相关资源
      最近更新 更多