JSONを介してリクエストデータを処理する次のコントローラーメソッドを作成しました。
public virtual JsonResult ExecMethod([SomeRequestBind(RequestType="Method")] RequestObject request)
SomeRequestBind は、RequestObject から派生型を選択する属性です。
public class RequestObjectGetSettings : RequestObject
{
public new AuthLoginParams Auth { get; set; }
public string Method <- this is derived from RequestObjects
}
AuthLoginParams このオブジェクトは 2 つのプロパティで構成されます
public class AuthLoginParams : AuthParams
{
[Required]
public string Name {get; set;}
[Required]
public string Pass {get; set;}
}
次のことを行うテスト プロジェクト (C#) をいくつか作成しました。
var request1 = new
{
Auth = new { Name = "whatever", Pass = "some_pass" },
Method = "GetSettings",
};
using (var wc = new WebClient())
{
wc.Headers[HttpRequestHeader.ContentType] = "application/json; charset=utf-8";
wc.Headers[HttpRequestHeader.AcceptLanguage] = "pl";
try
{
Console.WriteLine(serializer.Serialize(request1));
HtmlResult = wc.UploadString(URI, serializer.Serialize(request1));
Console.WriteLine(HtmlResult);
}
catch (WebException)
{
Console.WriteLine("SomeError");
}
}
このようにして、すべてが完璧に機能します。つまり、オブジェクトが適切に初期化されます。
しかし。私はJavaScriptから同じことを試しました:
var message2 = {
Auth:{
Name:"whatever",
Pass:"goodPass"
},
Method:"GetSettings"
};
$("#message").text(JSON.stringify(message2));
$.post("http://127.0.0.1:6661/ApiMethod",message2,{},"json");
/*$.ajax({
url:"http://127.0.0.1:6661/ApiMethod",
type:"post",
data:message2,
ContentType:"application/json; charset=utf-8",
dataType:"json"
});
*/
投稿するオブジェクトとして message2 を渡すと、Controller で Method プロパティが設定されますが、AuthLogin のプロパティは null です。JSON.stringify を試してみると、何も初期化されません。Firebug を調べたところ、投稿パラメーターは次のようになっていることがわかりました。
Auth[名前] blabalbla
Auth[パス] xxxxxx
メソッド GetSettings
そして、同様の方法でコントローラーに到達するように見えるため、このオブジェクトのこれらのプロパティを読み取ることができません。したがって、次のようなものではなく、次のようになります。
{Auth:{Name:"aaa",Pass:"aaa"},Method:"GetSettings"}
サーバーに送信します:
{Auth[Name]:"aaa",Auth[Pass]:"aaa",Method:"GetSettings"}
そのため、オブジェクトはネストする代わりにフラット化されます。
このオブジェクトを適切に送信するには?