序列化MVC4操作中的对象会导致空值

我正在使用jQuery 1.9.1和MVC 4。

我有以下的JavaScript:

$.ajax({
    url: '/Home/doSomething',
    type: 'POST',
    data: JSON.stringify({ devices: [{ Id: 123, Name: "something", MapName: "map" },{ Id: 321, Name: "a name", MapName: "another map" }] }),
    dataType: 'json',
    contentType: 'application/json'
}

和我的HomeController中的以下c#:

[HttpPost]
public string doSomething( Device[ ] devices )
{
    //stuff consuming that array
}

Device类是这样定义的:

[Serializable]
public class Device
{
    public long Id;
    public string Name;
    public string MapName;
}

根据调试器,devices阵列是一个2元素阵列,每个Device元素的所有属性都为空。

根据铬,发布数据如下所示:

{
    "devices": [
        {
            "Id": 123,
            "Name": "something",
            "MapName": "map"
        },
        {
            "Id": 321,
            "Name": "a name",
            "MapName": "another map"
        }
    ]
}

这里有什么错,使MVC发誓和那些对象是空的,但仍然给我一个适当长度的数组?

我试图直接发布数组,而无需调用JSON.stringify。 我曾尝试将数组内的数组作为称为“设备”的属性发布,但没有将其严格化。 我曾尝试将数组内容作为名为“devices”的属性发布,而只对数组进行字符串化。

所有这些导致一种或另一种形式的不良行为。 chrome不会首先发布适当的数据,或者MVC不会反序列化它。

我浏览了网页,似乎无法找到任何为什么应该被打破的例子。

编辑2013-02-21 13:12 UTC-5:

我也尝试过,不使用JSON,只是让jQuery将其作为表单数据发布。 以下是该代码:

var postData = { devices: [{ Id: 123, Name: "something", MapName: "map" }, { Id: 321, Name: "a name", MapName: "another map" }] };
$.ajax({
    url: '/Home/doSomething',
    type: 'POST',
    data: postData
});

而且C#仍然和上面一样。

但是,行为仍然与JSON时相同。 MVC看到一个由2个元素组成的数组,但该数组中的对象的所有值都是缺省值(整数为0,字符串为null)。


这是最后的工作...

首先,我更改了javascript以使该对象具有名为“devices”的属性,其中包含字符串数组:

var postData = { devices: JSON.stringify([{ Id: 123, Name: "something", MapName: "map" }, { Id: 321, Name: "a name", MapName: "another map" }]) };
$.ajax({
    url: '/Home/doSomething',
    type: 'POST',
    dataType: 'json',
    data: postData
    }

然后,我使控制器操作采用一个名为“devices”的字符串并使用JSON.Net手动对其进行反序列化:

[HttpPost]
public string MakeMmLinks( string devices )
{
    List<Device> devicesList = JsonConvert.DeserializeObject<List<Device>>( devices );
    ...
}

这工作得很好,但困扰我的是对象反序列化应该是MVC本身处理的东西。

如果有人对这里发生的事情或我做错了什么有所了解,我很乐意听到它。


在这样的情况下,我发现了tradition: true是非常重要的。 不知道你需要串流化

dataType: 'json',
traditional: true

您正在发布包含2个设备数组的属性的对象 。 如果您只想发布设备阵列,请尝试以下操作。

var devices = [{ Id: 123, Name: "something", MapName: "map" }, { Id: 321, Name: "a name", MapName: "another map" }];
$.ajax({
    url: '/Home/doSomething',
    type: 'POST',
    data: JSON.stringify(devices),
    dataType: 'json',
    contentType: 'application/json'
});
链接地址: http://www.djcxy.com/p/69497.html

上一篇: serializing object in MVC4 action results in null values

下一篇: How to handle exceptions in Tasks with debugger?