与 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]Asp.Net Core与配置系统的集成
[Asp.Net Core]Asp.Net Core与配置系统的集成
[Asp.Net Core]Asp.Net Core与配置系统的集成