ASP.NET la Liaison de Modèle MVC requête ajax avec jQuery

J'ai un serveur côté d'un objet dans mon MVC code qui ressemble à ceci:

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; }
}

De l'jQuery client, je fais une requête ajax et de l'envoi des données suivantes (les sauts de ligne introduit pour des raisons de lisibilité):

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 };
}

... et ainsi de suite jusqu'à obtenir les valeurs dans des variables

Veuillez noter que je suis l'envoi de ce qu'il devrait aller dans Person.Friends, le IList<T> comme un tableau JavaScript où chaque élément du tableau est un associatif liste qui a des propriétés tout comme le côté serveur Friend classe.

Voici ma requête 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 
  });

Dans mon contrôleur, tant que j'ai un FormCollection pour recevoir les données, je reçois toutes mes données, mais je voudrais lier fortement typé objet de Personne, donc si je change mon contrôleur de définition à partir de:

[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();
}

Je continue de faire mes données, mais je suis vraiment inquiète encore le IList<Friend>.

Il est reçu dans la Person objet comme un tableau qui a le bon nombre de Friends objets avec le droit de propriété des noms (Name et Id), mais les valeurs à la fois les propriétés de chaque Friend objet sont null ou 0, c'est à dire pas initialisé, même quand il y a des valeurs envoyées par le client.

S'il vous plaît aider.

OriginalL'auteur Water Cooler v2 | 2013-10-10