[英]Confused with FromBody in ASP.NET Core
我有以下 WEB API 方法,並且有一個帶有 Angular 的 SPA 模板:
[HttpPost]
public IActionResult Post([FromBody]MyViewModel model)
我想,基於這個主題,這里不需要使用[FromBody]
,因為我想從消息正文中讀取值,所以不需要覆蓋默認行為,但是,如果我不使用[FromBody]
,來自 Angular 的 model 是 null。我真的很困惑,我為什么要使用[FromBody]
,因為我已經使用了默認行為?
對於任何看到此問題的 .net core 3 - 您需要將 [ApiController] 添加到擴展 ControllerBase 的控制器。 [FromBody] 僅在您使用 MVC 控制器時才需要。
這會導致身體以您期望的方式自動處理。
您鏈接的問題是指 web-api。 您正在使用已重新編寫的 core-mvc 以將以前的 mvc 和 web-api 版本的管道合並到一個Controller
類中。
發布json
(與x-www-form-urlencoded
),需要[FromBody]
屬性來指示ModelBinder
使用內容類型標頭來確定用於讀取請求的IInputFormatter
。
有關 core-mvc 中模型綁定到 json 的詳細說明,請參閱ASP.NET Core 中的模型綁定 JSON POST 。
這是一種替代方法,假設您需要在控制器 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 。
希望它可以幫助某人!
請參閱我在[FromBody]
上的討論https://stackoverflow.com/a/75263628/5555938 。 它非常詳細地解釋了一切!
但總而言之, [FromBody]
不接受像[FromForm]
這樣的 HTML 表單字段名稱-值對。 它不接受傳統的 HTML 表單提交:它需要以下內容:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.