我做了以下控制器方法,它通过 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"}
因此,对象被展平而不是嵌套。
如何正确发送此对象?