jQuery1.9.1とMVC4を使用しています。
私は次の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を呼び出さずに、配列を直接投稿しようとしました。オブジェクト内の配列を「デバイス」と呼ばれるプロパティとして投稿しようとしましたが、これもまた非難することはありません。配列自体を文字列化するだけで、オブジェクト内の配列を「デバイス」と呼ばれるプロパティとして投稿しようとしました。
これらはすべて、何らかの形で悪い動作を引き起こします。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)。