web-dev-qa-db-ja.com

ASP.NET CoreのFromBodyと混同される

次のWEB APIメソッドがあり、AngularのSPAテンプレートがあります。

[HttpPost]
public IActionResult Post([FromBody]MyViewModel model)

this トピックに基づいて、ここで[FromBody]を使用する必要はないと考えました。メッセージ本文から値を読み取りたいため、デフォルトの動作をオーバーライドする必要がないからです。 、しかし、[FromBody]を使用しない場合、Angularからのモデルはnullです。本当に混乱しています。なぜ[FromBody]を使用する必要がありますか私はデフォルトの動作を使用しているので?

11
J.P

リンクした質問はweb-apiを参照しています。以前のmvcおよびweb-apiバージョンのパイプラインを1つのControllerクラスにマージするように書き直されたcore-mvcを使用しています。

jsonを投稿するとき(x-www-form-urlencoded)、[FromBody]属性は、リクエストの読み取りに使用するModelBinderを決定するためにcontent-typeヘッダーを使用するようIInputFormatterに指示するために必要です。

Core-mvcでのjsonへのモデルバインディングの詳細な説明については、 ASP.NET CoreでのJSON POSTのモデルバインディング を参照してください。

10
user3559349

この問題が発生した場合、.net core 3-ControllerBaseを拡張するコントローラーに[ApiController]を追加する必要があります。 [FromBody]は、MVCコントローラーを実行している場合にのみ必要です。

これにより、ボディは期待どおりに自動的に処理されます。

ApiController属性のMicrosoftドキュメント

0
Rob

そして、コントローラー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) { }

これで、署名を同じままにして、両方をサポートできるようになります。

そして、対処中に考えたもう1つのより永続的なアプローチ。

https://benfoster.io/blog/aspnet-core-customising-model-binding-conventions

それが誰かを助けることを願っています!

0
Tim Harker