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
Vous devez vous connecter pour publier un commentaire.
Il y a un bug dans MVC ils refusent de corriger cela si la colection de la propriété le nom commence par le nom du type, il ne se lie pas.
Changement
À:
juste temporaire. Il va travailler.
Serait de le renommer MyFriends travail? Que changerait-il assez de tel que la propriété n'est plus démarrer avec le nom du type de...
Je ne me souviens pas si c'est le début ou la fin. Mais essayez.
OriginalL'auteur regisbsb
Je pense que cela fonctionnera:
Aussi je préfère IEnumerable<> au lieu de IList<> si vous souhaitez effectuer une itération sur eux
Modifier
Cas de Test :
J'ajoute un test et il travail et je reçois la personne objet de serverside action
Vous devez ajouter " contentType: "application/json" " et " JSON.stringify () " à votre requête ajax, quand je les supprimer, je reçois aussi des valeurs nulles sur le serveur
Pour moi, la console rapports JSON.Stringify n'est pas une fonction. Est-il quelque chose que je dois inclure pour obtenir l'objet JSON?
Quel navigateur utilisez-vous? (êtes-vous à l'aide de minuscules de s dans stringify. il est peut-être une faute de frappe erreur)
OriginalL'auteur MRB
Vous devez spécifier le type de contenu:
contentType: "application/json"
. @MohammadRB solution contient, mais il devrait fonctionner même si vous n'avez pas stringify les données post.OriginalL'auteur mhangan