我正在使用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元素的所有属性都为null。
根据chrome,帖子数据如下所示:
{
"devices": [
{
"Id": 123,
"Name": "something",
"MapName": "map"
},
{
"Id": 321,
"Name": "a name",
"MapName": "another map"
}
]
}
这里有什么问题让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
});
C#仍与上述相同。
但是,行为仍然与JSON时的行为相同。 MVC看到一个包含2个元素的数组,但该数组中对象的所有值都是默认值(0表示整数,null表示字符串)。
答案 0 :(得分:3)
这是最终奏效的......
首先,我更改了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本地处理的东西。
如果有人对这里发生的事情或我做错了什么有任何见解,我很乐意听到。
答案 1 :(得分:1)
在这种情况下,我发现tradition: true
非常重要。不确定你需要stringify
dataType: 'json',
traditional: true
答案 2 :(得分: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'
});