7

我正在使用 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;
}

根据调试器,设备数组是一个 2 元素数组,每个设备元素的所有属性都为空。

根据chrome,post数据是这样的:

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

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

我试过直接发布数组,而不是调用 JSON.stringify 。我已经尝试将数组作为一个名为“设备”的属性发布在一个对象内,但又没有对其进行区分。我已经尝试将数组作为一个名为“设备”的属性发布在一个对象中,同时只对数组本身进行字符串化。

所有这些都会导致一种或另一种形式的不良行为。要么 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)。

4

3 回答 3

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
    }

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

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

这很好用,但困扰我的是对象反序列化应该是 MVC 原生处理的东西。

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

于 2013-02-25T16:20:03.930 回答
1

在这种情况下,我发现这tradition: true是非常重要的。不确定你需要字符串化

dataType: 'json',
traditional: true
于 2013-02-20T22:46:48.477 回答
0

您正在发布一个具有包含 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'
});
于 2013-02-20T21:50:54.247 回答