2011-11-02 3 views
0

Pourquoi la liaison de modèle d'imbrication à 3 niveaux de json ne fonctionne-t-elle pas?ASP.NET MVC 3 Liaison de modèle JSON avec objet à 3 niveaux

Test avec 2 niveaux, par exemple en ajoutant une propriété de chaîne sur LevelTwo, fonctionne, mais 3 niveaux doesnt? Est-ce par conception, un bug, ou est-ce que je manque quelque chose?

côté client post jQuery:

$.ajax({ 
     url: "MyController/MyAction", 
     dataType: "json", 
     type: "POST", 
     cache: false, 
     data: { 
      Level1: { 
       Level2: { 
        StringValue: "Test" 
       } 
      } 
     } 
    }); 

modèle côté serveur:

public class MyForm 
{ 
    public LevelOne Level1 { get; set; } 
} 

public class LevelOne 
{ 
    public LevelTwo Level2 { get; set; } 
} 

public class LevelTwo 
{ 
    public string StringValue { get; set; } 
} 

Répondre

1

Pourquoi ne marche pas le modèle d'imbrication 3 niveaux de liaison du travail JSON

Vous n'êtes pas l'envoi de tout JSON au serveur. Si vous voulez envoyer une demande de JSON, voici comment:

$.ajax({ 
    url: "MyController/MyAction", 
    contentType: 'application/json; charset=utf-8', 
    dataType: "json", 
    type: "POST", 
    cache: false, 
    data: JSON.stringify({ 
     Level1: { 
      Level2: { 
       StringValue: "Test" 
      } 
     } 
    }) 
}); 

La méthode JSON.stringify est ce sérialise le javascript littéral dans une chaîne JSON. Il est nativement construit dans les navigateurs modernes. Si vous devez prendre en charge les navigateurs existants, vous pouvez inclure le script json2.js sur votre page.

+0

Doh! Merci! J'ai supposé que dataType: "json" était tout ce qui était nécessaire. Vous savez, les hypothèses sont la mère de tous ... – MatteS

+0

@MatteS, 'dataType: 'json'' indique le type de contenu de la réponse, pas la requête. De même, si votre serveur envoie un en-tête de réponse Content-Type approprié à application/json, vous n'en aurez même pas besoin car jQuery le déduira automatiquement. Vous pouvez omettre ce paramètre de votre requête ajax. –

+0

Oui. Cela m'a fait revenir en arrière et rappeler pourquoi l'option dataType a été ajoutée pour commencer dans notre base de code, et il peut être intéressant de noter qu'elle ajoute l'en-tête "Accept: application/json, text/javascript, */*;" à la demande, et c'est quelque chose que notre logique de gestion des erreurs aime. – MatteS