与 ASP.NET Core 中的 FromBody 混淆

Posted

技术标签:

【中文标题】与 ASP.NET Core 中的 FromBody 混淆【英文标题】:Confused with FromBody in ASP.NET Core 【发布时间】: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 中的该参数,则此属性可能是可选的。 【参考方案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。

【讨论】:

以上是关于与 ASP.NET Core 中的 FromBody 混淆的主要内容,如果未能解决你的问题,请参考以下文章

与 ASP.NET Core 中的 FromBody 混淆

[Asp.Net Core]Asp.Net Core与配置系统的集成

[Asp.Net Core]Asp.Net Core与配置系统的集成

[Asp.Net Core]Asp.Net Core与配置系统的集成

Azure AD 与 ASP.NET Core MVC 中的标识

体验 ASP.NET Core 中的多语言支持(Localization)