3

ASP.NET MVC 3 の時代には、Phil Haack のブログJsonValueProviderFactoryに従って、JSON データをクエリ文字列パラメーターとして厳密に型指定されたパラメーターにバインドするために使用していました。

今日、これが機能していないことがわかりました。MVC Web API では、POSTED JSON データを厳密に型指定されたオブジェクト (要求の本文の JSON) にバインドするだけで、クエリ文字列の JSON データはバインドしないようです。

これは MVC 4 の場合ですか、それとも何が間違っていますか?

私のルート:

routes.MapRoute(
    name: "CreateUser",
    url: "{controller}/CreateUser/{userAccount}",
    defaults: new { action = "CreateUser"} );

私の方法:

public JsonResult CreateUser( MyObjectType userAccount)
{   /* user is null */ }

私のクラス:

public class MyObjectType
{
    public string CardNumber {get;set;}
}

その他のテスト:

// This completely fails, even if you URL Encode it:
localhost/CreateUser/{"CardNumber":"11111111"}

// Creates the object but all properties are null
localhost/CreateUser?{"CardNumber":"11111111"}
localhost/CreateUser?userAccount={"CardNumber":"11111111"}

また、値が必要ない場合でも、オブジェクトのすべてのプロパティをシリアル化しようとしました。名前のスペルや大文字と小文字が同じであることを確認しました。

パラメータを文字列として取得し、JSON.NET で問題なく逆シリアル化できますがDataAnnotationsModelState.IsValid.

4

1 に答える 1

2

あなたの場合、クエリ文字列に渡したものがJSONであることをフレームワークが理解する方法がないようです。へのリクエストlocalhost/CreateUser/{"CardNumber":"11111111"}はルート データ値プロバイダーによって処理されるため、key-value: が格納されますuserAccount={"CardNumber":"11111111"}。次に、DefaultModelBinder はキーによって値を要求し、userAccountそれを にバインドしようとしMyObjectTypeます。この時点で、取得した値が JSON 文字列であることを知る方法はありません。

JsonValueProviderリクエストが を持っている場合にのみ関与しますcontentType: application/json。このようなリクエストを本文とともに送信すると{CardNumber:"1111111"}、プロバイダーはそれをディクショナリに逆シリアル化し、そこから DefaultModelBinder が値を簡単に取得します。

于 2013-06-19T05:10:48.407 に答える