使用json格式时,嵌套模型的属性为null

时间:2012-11-10 12:36:26

标签: c# asp.net-mvc json

我正在使用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'

});

4 个答案:

答案 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)