2012-08-12 1 views
0

Bit d'une question vague, mais je ne sais pas comment je peux cela pour travailler. Firebug dit l'objet JSON (tableau?) De ma demande ajax ressemble:Comment puis-je convertir ce tableau Json dans un format lisible par JQuery?

{ 
"jsonResult": 
"[ 
    {\"OrderInList\":1}, 
    {\"OrderInList\":2} 
]" 
} 

Ceci est récupéré par suite d'une demande de paiement ajax .getJSON $:

$.getJSON("/Json/GetOrderSelectList?parentCategoryId=" + postData, testData, function (jsonResult) { 
     $('#orderInList option').remove(); 

     var map = { 
      "TestKey1": "TestValue1", 
      "TestKey2": "TestValue2" 
     }; 

     $.each(jsonResult, function (key, value) { 
      $("#orderInList").append($("<option value=" + key + ">" + value + "</option>") 
      ); 
     }); 

Si je remplace .each $ (jsonResult) avec $ .each (map) la liste de sélection se remplit correctement. Sinon, ma liste de sélection indique simplement "indéfini".

Je sérialiser JSON dans cette action dans mon MVC Controller:

public JsonResult GetOrderSelectList(int parentCategoryId) 
    { 
     var result = Session 
      .QueryOver<Category>() 
      .Where(x => x.Parent.Id == parentCategoryId) 
      .OrderBy(x => x.OrderInList).Asc 
      .List(); 

     var toSerialize = 
      result.Select(r => new {r.OrderInList}); 

     var jsonResult = JsonConvert.SerializeObject(toSerialize);        
     return Json(new 
         { jsonResult, 
         }, JsonRequestBehavior.AllowGet); 

    } 

Je pense donc que le problème pourrait être le format de l'action Json répond avec? Toute aide appréciée!

Modifier pour répondre

Les deux réponses ci-dessous m'a aidé. Je ne pouvais pas sembler taper fortement la variable jsonResult alors merci @JBabey pour avoir signalé mon erreur en lisant la propriété json, et en suggérant function (key, value) dans l'instruction $ .each.

Merci @Darin Dimitrov pour avoir aidé à trier mon contrôleur!

Répondre

2

L'action de votre contrôleur est incorrecte. Vous effectuez manuellement la sérialisation JSON à l'intérieur de celle-ci, puis renvoyez-la sous la forme d'un résultat JSON, ce qui se termine par une double sérialisation JSON. Vous pouvez directement retourner le tableau et laisser la plomberie sérialisation JSON au framework ASP.NET MVC:

public ActionResult GetOrderSelectList(int parentCategoryId) 
{ 
    var result = Session 
     .QueryOver<Category>() 
     .Where(x => x.Parent.Id == parentCategoryId) 
     .OrderBy(x => x.OrderInList) 
     .Asc 
     .List(); 
    return Json(result, JsonRequestBehavior.AllowGet); 
} 

puis:

$.getJSON("/Json/GetOrderSelectList?parentCategoryId=" + postData, testData, function (jsonResult) { 
    $('#orderInList option').remove(); 
    $.each(jsonResult, function() { 
     $('#orderInList').append(
      $("<option value=" + this.Id + ">" + this.Value + "</option>") 
     ); 
    }); 
}); 

Notez que j'utilise this.Id et this.Value ici. Cela suppose que le résultat JSON ressemble à ceci:

[{"Id": 1, "Value": "some value"}, {"Id": 2, "Value": "some other value"}] 

Vous devrez adapter ces noms de propriétés en fonction de votre modèle Category réelle.

+0

Cela semble vraiment bien, mais maintenant je reçois une erreur de 500 sur une référence circulaire (que vous ne pouviez pas connaître auparavant). Lorsque j'ajoute un .Select (x => x.OrderInList) à la requête, j'obtiens une erreur différente concernant mon parentCategoryId.Où déclaration: "La valeur" 1 "n'est pas de type" CumbriaMD.Domain.Category "et ne peut pas être utilisée dans cette collection générique
Nom du paramètre: valeur" hrrrm! Je pense que c'est pourquoi j'ai utilisé l'expression linq après avoir créé ma requête en premier lieu. – Kiada

+0

Où ajoutez-vous la clause '.Select'? Est-ce à la fin de la requête LINQ, juste après l'appel de la méthode '.List'? –

+0

Merci, ça marche maintenant :) – Kiada

1

Vous confondez une propriété de vos données renvoyées par votre ajax avec les données elles-mêmes. $.each fonctionnera bien si vous corrigez ceci.

Vos données renvoyées se présente comme suit:

{ 
    "jsonResult": "[ 
     {\"OrderInList\":1}, 
     {\"OrderInList\":2} 
    ]" 
} 

Ce qui signifie que l'objet est passé à votre fonction de succès. Appelez le data au lieu de jsonResult.

function (data) { 
    ... 
    $.each(data.jsonResult, function (key, value) { 
     ... 
    }); 
}); 

En outre, votre tableau est à venir à travers comme une chaîne, vous devrez peut-analyser avant de $.each sera en mesure de itérer il.

Questions connexes