我正在使用jquery将ajax post请求发送到我的ASP MVC4控制器,并且嵌套对象为空。
当我使用jquery.Post以URL编码格式发布时,数据模型按预期填充,但是当我尝试使用json格式使用jquery.ajax执行相同操作时,收到的模型已填充所有属性,但嵌套除外属性。
这些是通过fiddler捕获的请求数据。
使用帖子
Code=dfs&Name=sdf&Country.Code=PKR&Remarks=dfsdf
使用json
{"Code":"dsf","Name":"sdf","Country.Code":"PKR","Remarks":"dfsdf"}
由于
修改
public class City : IKeyed<int>{
public virtual int Id { get; protected set; }
public virtual string Code { get; set; }
public virtual string Name { get; set; }
public virtual Country Country { get; set; }
public virtual string Remarks { get; set; }
public virtual bool IsActive { get; set; }
}
public class Country : IKeyed<int> {
public virtual int Id { get; protected set; }
public virtual string Name { get; set; }
public virtual string Code { get; set; }
}
$.ajax({
url: url,
type: method,
dataType: 'json',
data: data,
contentType: 'application/json; charset=utf-8'
});
答案 0 :(得分:1)
写作
"Country.Code":"PKR"
实际上,您拥有 国家 对象,该对象具有 代码 属性。 像这样写出属性
"CountryCode":"PKR"
据我所知,这是你试图发布的json的唯一问题;
或者,将 代码 设为 国家 对象的实际属性,如此
"Country" : { "Code" : PKR" }
答案 1 :(得分:1)
URL编码的表单绑定和JSON绑定非常不同 - 实际上JSON只是被反序列化为对象,而不是像键值对这样的名称映射。要绑定嵌套属性,您需要在JSON中使用嵌套对象:
{"Code":"dsf","Name":"sdf","Country":{"Code":"PKR"},"Remarks":"dfsdf"}
答案 2 :(得分:0)
不要手动在json中构造对象。利用JSON.stringify:
的优势var obj = new Object();
obj.Code = "dsf";
obj.Name = "sdf";
obj.Country = new Object();
obj.Country.Code = "PKR";
obj.Remarks = "dfsdf";
JSON.stringify(obj) // gives you the object serialized to json format
答案 3 :(得分:0)
正确的做法是发出一个 post 请求,将传统设置为 false(传统:false)。默认情况下,jQuery 具有传统的 false。要传递嵌套或复杂的 JSON 对象,jQuery 需要实体主体。在 GET 请求的情况下,没有正文,因此 jQuery 将 JSON 转换为 JSON 字符串并附加到 URL。这就是为什么您的嵌套属性为 null 请参阅此 link 以供参考。如果您不能使用 POST 请求,并且您的控制器实现了 Web API,则使用 [FromUri] 属性到参数来强制 C# 从 URI 转换复杂类型。例如:
public HttpResponseMessage GetMethod([FromUri] City city)