MVC コードに次のようなサーバー側オブジェクトがあります。
class Person
{
public long Id { get; set; }
public string Name { get; set; }
public IList<Friend> Friends { get; set; }
}
class Friend
{
public long Id { get; set; }
public string Name { get; set; }
}
jQuery クライアントから ajax リクエストを作成し、次のデータを送信しています (読みやすくするために改行を入れています)。
var personId = $(...
var personName = $(...
var friends = []; // array of associative arrays
for (var i = 0; i < _friends.length; i++) // _friends is is a global array object and is different from friends below
{
var friendId = $(...
var friendName = $(...)
friends[i] = { 'Id' : friendId, 'Name' : friendName };
}
...など、変数に値を取得する
Person.Friends
に入る必要があるものを JavaScript 配列として送信していることに注意してください。配列の各要素は、サーバー側クラスIList<T>
と同様のプロパティを持つ連想リストです。Friend
ここに私のajaxリクエストがあります:
$.ajax('/Strings/JsonCreateNew',
{
cache: false, async: false, type: 'POST',
data: {
'Id' : personId,
'Name' : personName,
'Friends' : friends},
dataType: 'json',
error: SaveNewFriendClientSideHandler.OnError,
success: SaveNewFriendClientSideHandler.OnSuccess
});
私のコントローラーではFormCollection
、データを受信する必要がある限り、すべてのデータを取得しますが、厳密に型指定された Person オブジェクトにバインドしたいので、コントローラーの定義を次のように変更すると:
[HttpPost]
public ActionResult JsonCreateNew(FromCollection person)
{
// I get all the data in the person.AllKeys property
return new EmptyResult();
}
に:
[HttpPost]
public ActionResult JsonCreateNew(Person person)
{
// the default ASP.NET MVC model binder isn't able to bind to this
// in fact, the routing module does not even route the request to this
// action, so this action never gets fired.
return new EmptyResult();
}
私はまだすべてのデータを取得していますが、IList<Friend>
.
これは、正しいプロパティ名 (および)Person
を持つ正しい数のオブジェクトを持つ配列としてオブジェクトで受信されますが、各オブジェクトの両方のプロパティの値はまたは 0 です。クライアント。Friends
Name
Id
Friend
null
助けてください。