2010-12-07 10 views
2

je définir un objet comme:Envoi d'objets JSON complexes à Asp.net MVC en utilisant jQuery

data = { 
    first: { Id: 1, Name: "This is my first name." }, 
    second: { Id: 2, Name: "The second one." } 
}; 

Je suis en train d'émettre une requête Ajax en utilisant:

$.ajax({ 
    url: "/SomeURL" 
    type: "POST", 
    data: data, 
    success: function(){ ... }, 
    error: function(){ ... } 
}); 

Mais mon Les données sont converties en une structure de type tableau que le classeur par défaut de Asp.net MVC n'est pas en mesure de saisir.

first[Id]=1&first[Name]=... 

Que dois-je configurer ou faire, donc jQuery convertira correctement ceux-ci dans:

first.Id=1&first.Name=... 

Répondre

5

Avez-vous essayé aplatir vos données?

data = { 
    "first.Id": 1, 
    "first.Name": "This is my first name.", 
    "second.Id": 2, 
    "second.Name": "The second one." 
}; 

est ici un peu l'extension jQuery pour aplatir vos données:

jQuery.flatten = function(data) { 
    var flattenFunc = function(flattenedData, flattenFunc, name, value) { 
     if (typeof(value) == 'object') { 
      for (var item in value) { 
       flattenFunc(flattenedData, flattenFunc, name ? name + '.' + item : item, value[item]); 
      } 
     } 
     else { 
      flattenedData[name] = value; 
     } 
    }; 

    var flattenedData = new Array(); 
    flattenFunc(flattenedData, flattenFunc, null, data); 
    return flattenedData; 
}; 

data avec simplement remplacer $.flatten(data) dans votre requête Ajax.

+1

C'est proche de mon résultat final. J'ai créé un simple plugin jQuery qui fait la transformation de telle sorte que le classeur de modèle par défaut Asp.net MVC le comprenne. http://erraticdev.blogspot.com/2010/12/sending-complex-json-objects-to-aspnet.html –

+1

Je vois que vous avez aussi du support pour les dates. Bon travail! –

+0

Oui, oui. Merci. –

1
+0

L'article de blog que vous avez lié n'est pas vraiment une solution à mon problème. C'est juste à propos de JSON de/sérialisation en C#. Asp.NET MVC ne pourra pas lier les données JSON entrantes à moins qu'un classeur de données personnalisé ne soit ajouté.mais cela signifierait que je devrais changer le code sur le client aussi bien que sur le serveur. Merci pour les liens. –

2

Vous pouvez créer une fonction pour vos niveaux de N JSON à un JSON 1 niveau comme celui-ci:

$.simplifyJson = function(startingJson) { 
    var fn = function(startingJson, parentKey) { 
    var result = {}; 
    for(key in startingJson) { 
     var newKey = parentKey; 
     if(newKey != "") 
     newKey += "."; 
     newKey += key; 
     if(typeof(startingJson[key]) == "object") { 
     var result2 = fn(startingJson[key], newKey); 
     for(key2 in result2) { 
      result[key2] = result2[key2]; 
     } 
     } 
     else { 
     result[newKey] = startingJson[key]; 
     } 
    } 
    return result; 
    }; 

    return fn(startingJson, ""); 
} 

Ainsi, lorsque vous faites ceci:

var startingJson = { 
    a: "hola", 
    b: { 
    c: "chau", 
    d: "chau2" 
    } 
}; 

var endingJson = $.simplifyJson(startingJson); 

En endingJson vous obtiendrez ce

{ 
    a: "hola", 
    b.c: "chau", 
    b.d: "chau2" 
} 

est un exemple: http://jsfiddle.net/bY9nD/2/

+0

+1: J'ai attribué votre réponse mais j'ai accepté l'autre parce que c'est plus simple et plus polyvalent (pas besoin de partir d'un objet). –

0

Javascript

 var access = { 
      Id: 0, 
      HotelId: dropdownlistAccess.value(), 
      RoleId: dropdownlistRole.value(), 
      User: { 
       Email: email 
      } 
     }; 

     $.ajax({ 
      url: "Access/Add", 
      cache: false, 
      type: "POST", 
      contentType: 'application/json', 
      data: JSON.stringify(access), 
      success: function() { 
       refreshDataSource(); 
      } 
     }); 

travail pour le contrôleur d'action

public ActionResult Add(AccessViewModel newAccessViewModel) 
    { 
     // Your code here... 
    } 

Le AccessViewModel & champ UserViewModel

public partial class AccessViewModel 
{ 
    [Required(ErrorMessage="Id is required")] 
    public int Id { get; set; } 

    [Required(ErrorMessage="UserId is required")] 
    public int UserId { get; set; } 

    [Required(ErrorMessage="HotelId is required")] 
    public int HotelId { get; set; } 

    [Required(ErrorMessage="RoleId is required")] 
    public int RoleId { get; set; } 

    public UserViewModel User { get; set; } 
} 

public partial class UserViewModel 
{ 
    [Required(ErrorMessage="Id is required")] 
    public int Id { get; set; } 

    [Required(ErrorMessage="Email is required")] 
    [StringLength(50)] 
    [DataType(DataType.EmailAddress)] 
    public string Email { get; set; }  
}