次のWEB APIメソッドがあり、AngularのSPAテンプレートがあります。
[HttpPost]
public IActionResult Post([FromBody]MyViewModel model)
this トピックに基づいて、ここで[FromBody]
を使用する必要はないと考えました。メッセージ本文から値を読み取りたいため、デフォルトの動作をオーバーライドする必要がないからです。 、しかし、[FromBody]
を使用しない場合、Angularからのモデルはnullです。本当に混乱しています。なぜ[FromBody]
を使用する必要がありますか私はデフォルトの動作を使用しているので?
リンクした質問は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のモデルバインディング を参照してください。
この問題が発生した場合、.net core 3-ControllerBaseを拡張するコントローラーに[ApiController]を追加する必要があります。 [FromBody]は、MVCコントローラーを実行している場合にのみ必要です。
これにより、ボディは期待どおりに自動的に処理されます。
そして、コントローラー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 。
それが誰かを助けることを願っています!