【问题标题】:Property of nested model is null when using json format使用json格式时,嵌套模型的属性为空
【发布时间】:2012-11-10 12:36:25
【问题描述】:

我正在使用 jquery 向我的 ASP MVC4 控制器发送 ajax post 请求,并且嵌套对象为空。

当我使用 jquery.Post 以 URL 编码格式发布时,数据模型会按预期填充,但是当我尝试使用 jquery.ajax 使用 json 格式执行相同操作时,收到的模型会填充除嵌套的所有属性属性。

这些是通过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'

});

【问题讨论】:

  • 发布一些代码将有助于获得答案:)
  • 请注意,除 Country.Code 之外的所有字段都已填充。国家为空。所以我确信这个请求没有错。

标签: c# asp.net-mvc json


【解决方案1】:

写作

"Country.Code":"PKR"

实际上表示您有一个具有 Code 属性的 Country 对象。 像这样写属性

"CountryCode":"PKR"

据我所知,这是您尝试发布的 json 的唯一问题;

或者,使 Code 成为 Country 对象的实际属性,像这样

"Country" : { "Code" : PKR" }

【讨论】:

  • 不管怎样,如果你已经发布了你尝试读取属性的代码,你会得到一个更快的答案:),因为像这样,我必须假设问题是什么
  • 好的。我所做的编辑是对您的问题的实际回应:)。使用“国家”:{“代码”:“PKR”}
【解决方案2】:

URL 编码的表单绑定和 JSON 绑定非常不同 - 实际上 JSON 只是被反序列化为对象,而不是通过键值对等名称映射。要绑定嵌套属性,您需要在 JSON 中嵌套对象:

{"Code":"dsf","Name":"sdf","Country":{"Code":"PKR"},"Remarks":"dfsdf"}

【讨论】:

  • 很酷,它起作用了……但现在又遇到了另一个问题。我正在使用 JSON.stringify();生成json。显然它没有按照我想要的方式生成它:)
  • 哎呀对不起...它与 JSON.stringfy 无关。实际对象未正确生成...
【解决方案3】:

不要在 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

【讨论】:

  • 我也在做同样的事情......使用 serializeObject 从表单中的所有输入生成一个对象。问题出在 serializeObject 中。这是我通过谷歌搜索找到的功能
  • 函数 () { var o = {}; var a = this.serializeArray(); $.each(a, function () { if (o[this.name] !== undefined) { if (!o[this.name].push) { o[this.name] = [o[this.name ]]; } o[this.name].push(this.value || ''); } else { o[this.name] = this.value || ''; } });返回 o; };
  • 您的函数将表单序列化为对象。它的逻辑基于.serializeArray() 函数,它创建了一个JavaScript 对象数组-api.jquery.com/serializeArray。函数.serializeObject() next 将此对象数组展平为一个对象。不幸的是,据我所知,它并没有构造复杂的对象。
  • 这意味着,如果您的表单包含字段&lt;input name="Country.Code" value="PKR &gt;,它将被转换为简单对象,(转换为 JSON 后)如下所示:“Country.Code”:“PKR”,并且不是(如您所料)“国家”:{“代码”:“PKR”}
  • 找到我要找的 JQuery.Form 插件
【解决方案4】:

正确的做法是将传统设置为 false (traditional:false) 的 post 请求。 jQuery 默认有传统的 false 。要传递嵌套或复杂的 JSON 对象,jQuery 需要实体主体。如果是 GET 请求,则没有正文,因此 jQuery 将 JSON 转换为 JSON 字符串并附加到 URL。这就是为什么您的嵌套属性为 null 请参阅此link 以供参考。如果您不能使用 POST 请求并且您的控制器实现了 Web API,则使用 [FromUri] 属性作为参数来强制 C# 从 URI 转换复杂类型。例如:

public HttpResponseMessage GetMethod([FromUri] City city)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-04
    • 1970-01-01
    • 1970-01-01
    • 2014-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-10
    相关资源
    最近更新 更多