我有一个像这样构造的ajax帖子:
var myData = [ { id: "a", name: "Name 1" }, { id: "b", name: "Name 2" } ]; $.ajax({ type: 'POST', url: '/myurl/myAction', data: { items: myData }, dataType: 'json', error: function (err) { alert("error - " + err); } });
和一个MVC控制器:
[HttpPost] public JsonResult MyAction(MyClass[] items) { }
MyClass 只是数据的简单表示:
MyClass
public class MyClass { public string Name {get; set; } public string Id {get; set; } }
当JavaScript发出发布请求时,控制器动作确实确实接收到2个项目,但是这些项目中的属性(ID,名称)为null。
在提琴手中检查请求,正文如下所示:
Name | Value items[0][Name] | Name 1 items[0][Id] | a items[1][Name] | Name 2 items[1][Id] | b
我错过了什么吗?
是的,请阅读以下文章,以了解默认模型绑定程序期望绑定集合的正确连线格式。换句话说,要使其工作,而不是:
items[0][Name] | Name 1 items[0][Id] | a items[1][Name] | Name 2 items[1][Id] | b
您的有效载荷应该看起来像这样:
items[0].Name | Name 1 items[0].Id | a items[1].Name | Name 2 items[1].Id | b
不幸的是,使用jQuery来实现此有效负载可能会非常令人沮丧。因此,如果要使用AJAX将复杂的对象/数组发送到服务器,我建议您使用JSON负载:
$.ajax({ type: 'POST', url: '/myurl/myAction', data: JSON.stringify({ items: myData }), contentType: 'application/json', error: function (err) { alert("error - " + err); } });
注意事项:
data: JSON.stringify({ items: myData })
data: { items: myData }
contentType: 'application/json'
dataType: 'json'
现在您的负载看起来像这样:
{"items":[{"id":"a","name":"Name 1"},{"id":"b","name":"Name 2"}]}