1

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

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

});

4

4 回答 4

1

写作

"Country.Code":"PKR"

实际上是说您有一个Country对象,该对象具有Code属性。像这样写属性

"CountryCode":"PKR"

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

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

"Country" : { "Code" : PKR" }
于 2012-11-10T12:43:39.603 回答
1

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

{"Code":"dsf","Name":"sdf","Country":{"Code":"PKR"},"Remarks":"dfsdf"}
于 2012-11-10T12:47:00.177 回答
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
于 2012-11-10T12:58:02.550 回答
0

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

public HttpResponseMessage GetMethod([FromUri] City city)
于 2021-07-15T21:49:04.807 回答