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 这个对象由两个属性组成

    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 的属性为空。当我尝试 JSON.stringify 它不会初始化任何东西。当我查看 Firebug 时,我观察到 post 参数是:

Auth[名称] blabalbla

授权[通过] 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);

编辑 你在 jquery 的document.ready事件中调用 $.post,对吗?另外,尝试更改属性的名称。这不应该有所作为,但值得一试。尝试

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

另一种选择是简单地展平对象。在这种情况下,拥有授权模型没有任何好处。

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