0

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"}

そのため、オブジェクトはネストする代わりにフラット化されます。

このオブジェクトを適切に送信するには?

4

1 に答える 1

0

jqueryの投稿にこれを試してください

$.post("http://127.0.0.1:6661/ApiMethod",message2);

document.readyjqueryのイベント 内で$.postを呼び出している編集、正しいですか?また、プロパティの名前を変更してみてください。それは違いを生むべきではありませんが、一見の価値があります。試す

{
    Authentication: {Name:'name', Password:'pwd'},
    Method: 'method name'
}

もう1つのオプションは、オブジェクトを単純に平坦化することです。この場合、承認モデルを使用しても何も得られません。

{
    Name:'name', 
    Password:'pwd',
    Method: 'method name'
}
于 2012-11-14T13:55:31.720 に答える