3

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 です。クライアント。FriendsNameIdFriendnull

助けてください。

4

3 に答える 3

0

私はそれがうまくいくと思います:

var p = { 'Id' : personId, 'Name' : personName, 'Friends' : friends };
$.ajax('/Strings/JsonCreateNew', 
  { 
    type: 'POST', 
    data: JSON.Stringify({ person : p }), 
    contentType : "application/json",
    dataType: 'json', 
    error: SaveNewFriendClientSideHandler.OnError, 
    success: SaveNewFriendClientSideHandler.OnSuccess 
  });

また、反復処理のみが必要な場合は、 IList<> の代わりに IEnumerable<> を好みます

テスト ケースの編集:

var friends = new Array();
friends.push({ Id: "1", Name: "A" });
friends.push({ Id: "2", Name: "B" });
var p = { 'Id': 5, 'Name': "Mohammad", 'Friends': friends };

$(document).ready(function () {

  $.ajax('/Home/JsonCreateNew',
  {
      type: 'POST',
      data: JSON.stringify({ person: p }),
      contentType: "application/json",
      dataType: 'json',
      error: function () { alert("f"); },
      success: function () { alert("s"); }
  });

});
于 2013-10-10T15:14:41.570 に答える