2010-11-23 25 views
4

Je construis mon JsonResult dans le contrôleur en ajoutant quelques informations supplémentaires à un JsonResult déjà existant (renvoyé à partir d'une méthode différente). Pour ajouter plus de propriétés, je me suis converti le JsonResult initial dans un dictionnaire:Comment puis-je retourner un Dictionary <string, Object> comme JsonResult, ET obtenir le bon résultat dans JavaScript?

IDictionary<string, object> wrapper = (IDictionary<string, object>)new 
    System.Web.Routing.RouteValueDictionary(json.Data); 

Puis-je ajouter des données en écrivant wrapper["..."] = "value".

La méthode renvoie une nouvelle JsonResult, avec emballage comme .Data:

new JsonResult() { wrapper, JsonRequestBehavior.AllowGet }; 

et c'est là les ennuis commencent; alors que la communication se passe parfaitement et que la fonction de succès est appelée, le tableau résultant que j'utilise en JavaScript n'a pas la structure propre que j'attends: au lieu d'accéder aux valeurs comme val = ret.PropName1; je dois accéder à un simple tableau indexé, qui contient tourner un dictionnaire avec deux paires: { "Value"="val, "Key"="PropName1" }; (donc quelque chose comme o[0].Key me donnerait le nom de la propriété)

Je voudrais savoir s'il y a une façon intelligente, rapide de réécrire la création JsonResult dans le contrôleur, pour obtenir une belle nettoyer le dictionnaire dans la vue. Il y a quelques idées que j'ai, mais elles ne sont pas particulièrement propres: je pourrais jeter JsonResult réutiliser du côté du serveur, et juste faire un objet anonyme avec toutes les bonnes propriétés; ou, je pourrais faire une fonction de traduction en Javascript qui pourrait traduire le résultat dans un nouveau tableau(). Je cherche de meilleures solutions.

[Édition ultérieure] Le tableau est présenté comme il le fait car le dictionnaire a été défini comme <string, object>. Si c'était <string, string>, il serait envoyé comme je l'avais initialement prévu. Mais puisque j'utilise réellement des objets de ce sac, je vais juste le laisser tel quel, et passer la réponse de JSON par la fonction ci-dessous.

Répondre

1

Addendum: en écrivant la question ci-dessus, il me est apparu que la traduction entre tableau « mauvais » tableau et « bon » est en effet très simple:

function translateAjaxResult(ret) { 
     var result = new Array(); 

     if (ret == null) return result; 
     for(var i = 0; i < ret.length; i++) 
      result[ret[i].Key] = ret[i].Value; 
     return result; 
    } 

Néanmoins, il est encore un patch à un problème et pas une solution à un problème, alors j'aimerais toujours une solution plus élégante.

+0

solution de contournement acceptée, éventuellement; aucune meilleure solution ne s'est présentée. – Liz