web-dev-qa-db-ja.com

JSONポストをWeb APIにバインドする.Netコアモデル

.NET Coreを使用して新しいプロジェクトを開始しました。 Web APIコントローラーと関連メソッドを追加しました。 Postmanを使用して、JSONオブジェクトを作成し、コントローラーメソッドにポストしました。 JSONオブジェクトは、コントローラーメソッドのObjectパラメーターと正確に一致することに注意してください。

デバッグモードでは、オブジェクトが表示されます。nullではなく、プロパティがありますが、prop値はデフォルトでその代表型、0 for intなど。

この動作はこれまで見たことがありません…ですから、まったく同じコードとオブジェクトを取得し、Web API 2コントローラーを備えたMVCプロジェクトに複製しましたが、完全に機能します。

何が欠けていますか?POST JSONと.NET Coreのモデルバインドはできませんか?

この記事を読むと、フォームPOSTまたはクエリ文字列変数として送信する場合を除き、私はうまくいかないようです。

https://lbadri.wordpress.com/2014/11/23/web-api-model-binding-in-asp-net-mvc-6-asp-net-5/

JSON:

{
   "id": "4",
   "userId": "3"
   "dateOfTest": "7/13/2017"
}

方法:

[HttpPost]
[Route("test1")]
[AllowAnonymous]
public IActionResult Test(Class1 data)
{
    return Ok();
}
11
Mike Anderson

次のようにFromBody属性を使用して、パラメーターを本文からのものとしてマークする必要があります。

[HttpPost]
[Route("test1")]
[AllowAnonymous]
public IActionResult Test([FromBody] Class1 data)
{
    return Ok();
}

Postmanのコンテンツタイプとしてapplication/jsonを使用していることを確認する必要があります。

Postman application/json

その結果:

json POST action

プロパティセッターも公開されていることを確認してください。

public class Person
{
    public String Name;
    public Int32 Age;
}
20
Matt

私もこれに苦労していたので、受け入れられた答えではなく、自分に必要なアイテムを1つ共有すると思ったので、{get;クラスの各属性に次のように設定します。}

    public class LogString{
        public string val {get; set;}
        public string data {get; set;}
    }

残りは同じでした:

        [HttpPost]
        public void Post([FromBody] LogString message)
        {      
            Console.WriteLine(message.val);
        }

それを追加した後、動作し始めました。

0
edencorbin

私はこの問題に数時間苦労してきましたが、既存のソリューションはどれもうまくいきませんでしたが、着信インスタンスのクラス用のパブリックなパラメーターレスコンストラクターがないことがわかりました。この場合、 Class1は、コンストラクターのみを保護し、パラメーターは常にnullでした。それが誰かを助けることを願っています。