我有以下WEB API方法,并且有一个带Angular的SPA模板:
[HttpPost]
public IActionResult Post([FromBody]MyViewModel model)
我认为,根据this主题,这里不需要使用[FromBody]
,因为我想从消息体中读取值,因此不需要覆盖默认行为但是,如果我不使用[FromBody]
,则来自Angular的模型为空。我真的很困惑,为什么我应该使用[FromBody]
,因为我使用了默认行为?
答案 0 :(得分:7)
您链接的问题是指web-api。您正在使用已重写的core-mvc将以前的mvc和web-api版本的管道合并为一个Controller
类。
发布json
(与x-www-form-urlencoded
相对应)时,需要[FromBody]
属性来指示ModelBinder
使用内容类型标头来确定IInputFormatter
1}}用于阅读请求。
有关core-mvc中json模型绑定的详细说明,请参阅Model binding JSON POSTs in ASP.NET Core。
答案 1 :(得分:2)
对于发现此问题.net核心3的任何人,您都需要将[ApiController]添加到扩展ControllerBase的控制器中。 仅在执行MVC控制器时才需要[FromBody]。
这会使主体按照您期望的方式自动处理。
答案 2 :(得分:0)
这是另一种方法,假设您需要在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。
希望它对某人有帮助!