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

dod*_*ron 7 c# jquery json asp.net-mvc-4

我正在使用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'
}
Run Code Online (Sandbox Code Playgroud)

以及我的HomeController中的以下c#:

[HttpPost]
public string doSomething( Device[ ] devices )
{
    //stuff consuming that array
}
Run Code Online (Sandbox Code Playgroud)

Device类定义如下:

[Serializable]
public class Device
{
    public long Id;
    public string Name;
    public string MapName;
}
Run Code Online (Sandbox Code Playgroud)

根据调试器,devices数组是一个2元素数组,每个Device元素的所有属性都为null.

根据chrome,帖子数据如下所示:

{
    "devices": [
        {
            "Id": 123,
            "Name": "something",
            "MapName": "map"
        },
        {
            "Id": 321,
            "Name": "a name",
            "MapName": "another map"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

这里有什么问题让MVC发誓这些对象是空的,但仍然给我一个适当长度的数组呢?

我试过直接发布数组,而不调用JSON.stringify.我已经尝试将数组作为名为"devices"的属性发布在对象中,同样没有对其进行描述.我已经尝试将数组作为名为"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
});
Run Code Online (Sandbox Code Playgroud)

C#仍然和上面一样.

但是,行为仍然与JSON时的行为相同.MVC看到一个包含2个元素的数组,但该数组中对象的所有值都是默认值(0表示整数,null表示字符串).

dod*_*ron 4

这就是最终起作用的......

首先,我更改了 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
    }
Run Code Online (Sandbox Code Playgroud)

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

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

这工作得很好,但令我困扰的是对象反序列化应该是 MVC 本地处理的事情。

如果有人对这里发生的事情或我做错了什么有任何见解,我很想听听。