web-dev-qa-db-ja.com

Asp.net Core 2 API POSTオブジェクトはNULLですか?

いくつかのテスト機能を備えた.net Core 2 APIセットアップがあります。 (Visual Studio 2017)

郵便配達員を使用して、私はそのメソッドの生データで投稿を行いますが、モデルは空ですか?どうして?

        // POST api/Product/test
        [HttpPost]
        [Route("test")]
        public object test(MyTestModel model)
        {
            try
            {
                var a = model.SomeTestParam;

                return Ok("Yey");
            }
            catch (Exception ex)
            {
                return BadRequest(new { message = ex.Message });
            }
        }

        public class MyTestModel
        {
            public int SomeTestParam { get; set; }

        }

enter image description here

enter image description here

15
Ruan

モデルに[FromBody]属性を含める必要があります。

[FromBody] MyTestModel model

詳細については、Andrew Lockの post を参照してください。

ASP.NET CoreでJSONを正しくバインドするには、パラメーターに属性[FromBody]を含めるようにアクションを変更する必要があります。これにより、要求のコンテンツタイプヘッダーを使用して、構成済みのIInputFormatterのどれをモデルバインディングに使用するかを決定するようにフレームワークに指示します。

コメントの@anserkで指摘されているように、これにはContent-Typeヘッダーをapplication/jsonに設定する必要もあります。

25
Kirk Larkin

受け入れられた回答にさらに情報を追加するには:

属性を使用せずにパラメーターが自動的にバインドされる3つのソースがあります。

フォーム値:これらは、POSTメソッドを使用してHTTPリクエストに含まれるフォーム値です(jQuery POSTリクエストを含む)。

ルート値:ルーティングによって提供されるルート値のセット

クエリ文字列:URIのクエリ文字列部分。

Bodyはそれらの1つではないことに注意してください(そうすべきだと思いますが)。

したがって、本文からバインドする必要がある値がある場合は、属性バインディング属性を使用する必要があります。

Bodyからのパラメーターは自動的にバインドされると思っていたので、これは昨日私をつまずかせました。

2番目の小さな点は、1つのパラメーターのみをBodyにバインドできることです。

[FromBody]で装飾されたアクションごとに最大1つのパラメーターがあります。 ASP.NET Core MVCランタイムは、要求ストリームの読み取りの責任をフォーマッターに委任します。パラメータのリクエストストリームが読み取られると、通常、他の[FromBody]パラメータをバインドするためにリクエストストリームを再度読み取ることはできません。

したがって、必要なパラメーターが複数ある場合は、それらをバインドするModelクラスを作成する必要があります。

public class InputModel{
   public string FirstName{get;set;}
   public string LastName{get;set;}
}

[HttpPost]
public IActionResult test([FromBody]InputModel model)...

ドキュメント

3
Greg Gum