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

Ale*_*lex 34 javascript c# 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',
    error: function (err) {
        alert("error - " + err);
    }
});
Run Code Online (Sandbox Code Playgroud)

和一个MVC控制器:

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

}
Run Code Online (Sandbox Code Playgroud)

MyClass 只是数据的简单表示:

public class MyClass {
    public string Name {get; set; }
    public string Id {get; set; }
}
Run Code Online (Sandbox Code Playgroud)

当javascript发出post请求时,控制器操作确实会收到2个项目,但这些项目中的属性(id,name)为null.

在fiddler中检查请求,正文如下所示:

Name                 | Value
items[0][Name]       | Name 1
items[0][Id]         | a
items[1][Name]       | Name 2
items[1][Id]         | b
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?

Dar*_*rov 65

我错过了什么吗?

是的,请查看以下文章,以了解默认模型绑定程序对绑定集合所期望的正确的有线格式.换句话说,为了工作,而不是:

items[0][Name]       | Name 1
items[0][Id]         | a
items[1][Name]       | Name 2
items[1][Id]         | b
Run Code Online (Sandbox Code Playgroud)

你的有效载荷应该是这样的:

items[0].Name       | Name 1
items[0].Id         | a
items[1].Name       | Name 2
items[1].Id         | b
Run Code Online (Sandbox Code Playgroud)

不幸的是,使用jQuery实现此有效负载会非常令人沮丧.因此,如果您想使用AJAX将复杂对象/数组发送到服务器,我建议您使用JSON有效负载:

$.ajax({
    type: 'POST',
    url: '/myurl/myAction',
    data: JSON.stringify({ items: myData }),
    contentType: 'application/json',
    error: function (err) {
        alert("error - " + err);
    }
});
Run Code Online (Sandbox Code Playgroud)

需要注意的事项:

  • data: JSON.stringify({ items: myData }) 代替 data: { items: myData }
  • 添加 contentType: 'application/json'
  • 摆脱了 dataType: 'json'

现在您的有效负载如下所示:

{"items":[{"id":"a","name":"Name 1"},{"id":"b","name":"Name 2"}]}
Run Code Online (Sandbox Code Playgroud)

  • 这可能很明显但也注意到`{get; 组; 你的属性服务器端的`也将成为或破坏这个!这就是我所缺少的一切,但这使我指向了正确的方向.谢谢! (5认同)