Post un Tableau d'Objets via JSON à ASP.Net MVC3
Je suis à la recherche d'une solution pour l'Affichage d'un tableau d'objets à MVC3 via JSON.
Exemple de code je suis en train de travailler hors de:
http://weblogs.asp.net/scottgu/archive/2010/07/27/introducing-asp-net-mvc-3-preview-1.aspx
JS:
var data = { ItemList: [ {Str: 'hi', Enabled: true} ], X: 1, Y: 2 };
$.ajax({
url: '/list/save',
data: JSON.stringify(data),
success: success,
error: error,
type: 'POST',
contentType: 'application/json, charset=utf-8',
dataType: 'json'
});
ListViewModel.cs:
public class ListViewModel
{
public List<ItemViewModel> ItemList { get; set; }
public float X { get; set; }
public float Y { get; set; }
}
ItemViewModel.cs:
public class ItemViewModel
{
public string Str; //originally posted with: { get; set; }
public bool Enabled; //originally posted with: { get; set; }
}
ListController.cs:
public ActionResult Save(ListViewModel list)
{
//Do something
}
Le résultat de ce POST:
liste est définie, à un ListViewModel
Ses propriétés X et Y sont définis
Le sous-jacent ItemList propriété est définie
Le ItemList contient un seul élément, comme il se doit
L'élément qui ItemList est non initialisée. Str est nulle et Activé est faux.
Mettre une autre manière, c'est ce que je reçois de MVC3 de liaison de modèle:
list.X == 1
list.Y == 2
list.ItemList != null
list.ItemList.Count == 1
list.ItemList[0] != null
list.ItemList[0].Str == null
Il semblerait que le MVC3 JsonValueProvider ne fonctionne pas pour les objets complexes. Comment puis-je obtenir que cela fonctionne? Dois-je modifier l'existant MVC3 JsonValueProvider et le fixer? Si oui, comment puis-je obtenir à et de le remplacer dans un MVC3 projet?
Liées StackOverflow questions que j'ai déjà exercé en vain:
Asp.net Mvc, Ajax, Json post (Array)
Utilise MVC2 et plus en fonction du formulaire de codage - cette approche échoue avec un objet qui contient un tableau d'objets (JQuery ne parvient pas à coder correctement).
Post un tableau d'objets complexes avec JSON, JQuery ASP.NET Contrôleur MVC
Utilise un hack, je voudrais éviter où le Contrôleur reçoit plutôt une simple chaîne de caractères qu'elle a ensuite manuellement désérialise lui-même, plutôt que de profiter du cadre.
MVC3 RC2 JSON Post de Liaison ne fonctionne pas correctement
N'a pas eu son content-type set - c'est dans mon code.
Comment publier un tableau d'objets complexes avec JSON, jQuery ASP.NET MVC Contrôleur?
Ce pauvre gars a dû écrire une JsonFilter juste pour analyser un tableau. Un autre hack, je préfère éviter.
Alors, comment puis-je faire cela?
- Mise à jour: j'ai creusé dans la JsonValueProviderFactory. Correctement consomme de la "str" de la propriété et l'ajoute à la sauvegarde du Dictionnaire en tant que Key="ItemList[0].Str", Value="salut", ce qui semble correct. ModelBinder?
- Vous monsieur, vient de recevoir un upvote et une étoile pour votre excellente exécution d'un débordement de pile-question! 🙂
- Même ici, c'était la on a finalement fait le travail pour moi. Merci!
Vous devez vous connecter pour publier un commentaire.
En plus de
{ get; set; }
, ces sont les conditions pour JSON en charge de la Liaison:{ get; set; }
méthode.Lire plus à mon post.
Espère que ça aide!
Le problème était que les propriétés dans les modèles qui ont été dans la Liste n'ont pas get/set sur leurs propriétés publiques. Mettre une autre manière, MVC3 automatique du JSON de liaison ne fonctionne que sur les propriétés de l'objet qui ont get et set.
Ce ne sera pas lier:
Ce lient:
public string Str;
n'est pas une propriété, mais simplement un champ. "les Champs sont de simples variables de membre ou de membre des instances d'une classe. Les propriétés sont une abstraction d'obtenir et de définir sur le terrain des valeurs." Pourquoi JsonValueProvider refusé de mettre à jour les champs est une autre question tout à fait!C'est étrange. Je n'arrive pas à reproduire votre problème. Voici ma configuration (ASP.NET MVC 3 RTM):
Modèle:
Contrôleur:
Vue:
L'exécution de cette alertes
"hi"
et à l'intérieur de laSave
action, tout est correctement initialisé.Et juste pour l'enregistrement de ce qui ne fonctionne pas sont les Dictionnaires. J'ai ouvert un ticket sur la question.
J'ai eu un problème similaire, et a constaté que pour un objet complexe, les valeurs numériques ont été prise en manquer. Ils étaient comme des zéros.
c'est à dire
a été reçu par le contrôleur MVC comme un objet Personne où les propriétés ont été peuplée que la
Name=John
etAge=0
.J'ai ensuite fait la valeur d'Âge en Javascript à la chaîne... c'est à dire
Et c'est venu par le biais de l'amende juste...
Son parce que le MVC liants genre de sucer. Cependant, ils ne fonctionnent assez bien si tous JSON valeurs venir comme une chaîne de caractères.
En JS si vous faites cela
Elle permettra d'évaluer à 1, de ne pas 1.0
Ainsi, lorsque vous l'a envoyé sur le serveur, il va essayer de se lier à un flotteur de ce nom et on ne le trouvera pas, car il est venu comme 1 au lieu de 1.0. Sa lame et fou que MS ingénieurs n'est pas venu avec une solution par défaut pour cette. - Je trouver si vous string tout les fixations sont assez intelligents pour trouver des choses.
Donc, avant d'envoyer les données au cours de l'exécuter si une stringifier qui permettra également de convertir toutes les valeurs de chaînes.
Toutes les réponses précédentes étaient grands pour me pointer à la solution du problème similaire. J'ai eu de POST
x-www-form-urlencoding
au lieu deapplication/json
(option par défaut si contentType paramètre est manquant) pour être en mesure de passer__RequestVerificationToken
et simultanément confronté à un problème lorsque les propriétés de l'objet en cours dans le tableau ne sont pas lier leurs valeurs. La façon de résoudre le problème est de comprendre le travail intérieur de la MVC modèle de classeur.Donc, en gros, quand vous en avez besoin pour la fourniture de vérification jeton vous êtes limité avec la validation de l'attribut. Et vous devez fournir le jeton que le paramètre n'est pas comme une partie de l'JSON-objet que vous envoyez. Si vous n'utilisez pas de
ValidateAntiForgeryToken
, vous pourriez obtenir avec JSON.stringify. Mais si vous voulez, vous ne pouviez pas passer le jeton.J'ai reniflé le trafic de backend quand
ContentType
étaitx-www-form-urlencoding
et je remarque que mon tableau d'objets complexes a été sérialisé à quelque chose comme ça:klo[0][Count]=233&klo[0][Blobs]=94
. Ce tableau a d'abord été une partie de la racine d'un objet, disons, certains modèle. Ça ressemblait à ça:model.klo = [{ Count: 233, Blobs: 94}, ...]
.À l'arrière-plan côté de ce qu'
klo
propriété a été créer par MVC liant avec les mêmes éléments comte, que j'ai envoyé. Mais ces éléments n'étaient pas obtenir les valeurs de leurs propriétés.SOLUTION
À traiter avec cela, j'exclus
klo
propriété de l'objet modèle du client. Dans leajax
fonction que j'ai écrit ce code:La fonction transforme tableau d'objet complexe dans la forme qui est reconnue par MVC-liant. Le formulaire est
klo[0].Count=233&klo[0].Blobs=94
.