C# Ajax发布到ASP.net MVC控制器-对象属性为空

C# Ajax发布到ASP.net MVC控制器-对象属性为空,c#,javascript,ajax,asp.net-mvc,C#,Javascript,Ajax,Asp.net Mvc,我有一篇ajax文章的结构如下: var myData = [ { id: "a", name: "Name 1" }, { id: "b", name: "Name 2" } ]; $.ajax({ type: 'POST', url: '/myurl/myAction', data: { items: myData }, dataType: 'json',

我有一篇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);
    }
});
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":[{"id":"a","name":"Name 1"},{"id":"b","name":"Name 2"}]}
和一个MVC控制器:

[HttpPost]
public JsonResult MyAction(MyClass[] items)
{

}
MyClass
只是数据的简单表示:

public class MyClass {
    public string Name {get; set; }
    public string Id {get; set; }
}
当javascript发出post请求时,控制器操作确实接收到2个项目,但是这些项目中的属性(id、名称)为null

在fiddler中检查请求,主体如下所示:

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);
    }
});
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":[{"id":"a","name":"Name 1"},{"id":"b","name":"Name 2"}]}
我错过什么了吗

我错过什么了吗

是的,请查看以了解默认模型绑定器希望绑定集合的正确导线格式。换言之,为了让这一点发挥作用,而不是:

items[0][Name]       | Name 1
items[0][Id]         | a
items[1][Name]       | Name 2
items[1][Id]         | b
您的有效负载应该如下所示:

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);
    }
});
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":[{"id":"a","name":"Name 1"},{"id":"b","name":"Name 2"}]}
不幸的是,使用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'
  • 摆脱了数据类型:“json”
现在,您的有效负载如下所示:

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);
    }
});
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":[{"id":"a","name":"Name 1"},{"id":"b","name":"Name 2"}]}

您可以使用以下代码来解决此问题:

$.ajax({
    url: '/myurl/myAction',
    data: { '': items },
    method: "POST",
    dataType: 'json',
    success: function (xhr, status, response) {
    },
    error: function (xhr, status, response) {
    }
});

[HttpPost]
public JsonResult MyAction(IEnumerable<MyClass> items)
{

}
$.ajax({
url:“/myurl/myAction”,
数据:{'':项},
方法:“张贴”,
数据类型:“json”,
成功:功能(xhr、状态、响应){
},
错误:函数(xhr、状态、响应){
}
});
[HttpPost]
公共JsonResult MyAction(IEnumerable项)
{
}

只是猜测,可能是因为属性在javascript中是小写的,而在C#中是大写的。不,不是这样。JSON序列化程序不区分大小写。属性为null的另一种情况是,我花了两个小时的时间试图找出代码的错误。谢谢你,伙计!这可能很明显,但也要注意,您的属性服务器端的
{get;set;}
也将决定这一点!这就是我所缺少的,但这为我指明了正确的方向。谢谢@Ihan-您刚刚保存了我剩下的一点理智。我错过了内容类型。如果添加“内容类型”无法正确传递令牌,您如何将请求验证令牌与此请求一起传递。