簡體   English   中英

與 ASP.NET Core 中的 FromBody 混淆

[英]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 控制器時才需要。

這會導致身體以您期望的方式自動處理。

ApiController 屬性的 Microsoft 文檔

您鏈接的問題是指 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 表單提交:它需要以下內容:

  1. JavaScript POST 請求手動發送到 Web API 服務器
  2. JavaScript Http Header附帶 JSON mime 類型
  3. JavaScript Http Body with form field 提取數據,重新格式化並提交為 JSON。傳統的 HTML POST 名稱-值對將不起作用!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM