私はこのように構築されているajaxの投稿を持っています:
var myData = [
{
id: "a",
name: "Name 1"
},
{
id: "b",
name: "Name 2"
}
];
$.ajax({
type: 'POST',
url: '/myurl/myAction',
data: { items: myData },
dataType: 'json',
error: function (err) {
alert("error - " + err);
}
});
MVCコントローラー:
[HttpPost]
public JsonResult MyAction(MyClass[] items)
{
}
MyClass
はデータの単純な表現です。
public class MyClass {
public string Name {get; set; }
public string Id {get; set; }
}
JavaScriptがポストリクエストを行うと、コントローラーアクションは実際に2つのアイテムを受け取りますが、これらのアイテムのプロパティ(id、name)はnullです。
フィドラーでリクエストを確認すると、本文は次のようになります。
Name | Value
items[0][Name] | Name 1
items[0][Id] | a
items[1][Name] | Name 2
items[1][Id] | b
私は何かを見逃しましたか?
私は何かを見逃しましたか?
はい、 次の記事 を参照して、デフォルトのモデルバインダーがコレクションのバインドに期待する正しいワイヤー形式を理解してください。言い換えれば、これが機能するためには、次の代わりに:
_items[0][Name] | Name 1
items[0][Id] | a
items[1][Name] | Name 2
items[1][Id] | b
_
ペイロードは次のようになります。
_items[0].Name | Name 1
items[0].Id | a
items[1].Name | Name 2
items[1].Id | b
_
残念ながら、jQueryを使用すると、このペイロードを達成するのは非常にイライラする可能性があります。このため、AJAXを使用してサーバーに複雑なオブジェクト/配列を送信する場合は、JSONペイロードを使用することをお勧めします。
_$.ajax({
type: 'POST',
url: '/myurl/myAction',
data: JSON.stringify({ items: myData }),
contentType: 'application/json',
error: function (err) {
alert("error - " + err);
}
});
_
注目すべきこと:
data: { items: myData }
_の代わりにdata: JSON.stringify({ items: myData })
contentType: 'application/json'
_を追加しましたdataType: 'json'
_を取り除きましたこれで、ペイロードは次のようになります。
_{"items":[{"id":"a","name":"Name 1"},{"id":"b","name":"Name 2"}]}
_