Est-il possible d'utiliser JSON.NET comme sérialiseur JSON par défaut dans ASP.NET MVC 3?
D'après mes recherches, il semble que le seul moyen d'y parvenir soit d' étendre ActionResult car JsonResult dans MVC3 n'est pas virtuel ...
J'espérais qu'avec ASP.NET MVC 3, il y aurait un moyen de spécifier un fournisseur enfichable pour la sérialisation vers JSON.
Pensées?
asp.net-mvc-3
json.net
jsonresult
zam6ak
la source
la source
Réponses:
Je pense que la meilleure façon de le faire est - comme décrit dans vos liens - d'étendre ActionResult ou d'étendre JsonResult directement.
Quant à la méthode JsonResult qui n'est pas virtuelle sur le contrôleur ce n'est pas vrai, il suffit de choisir la bonne surcharge. Cela fonctionne bien:
EDIT 1 : Une extension JsonResult ...
EDIT 2 : J'ai supprimé la vérification des données étant nulles selon les suggestions ci-dessous. Cela devrait rendre les nouvelles versions de JQuery heureuses et semble être la chose saine à faire, car la réponse peut alors être désérialisée de manière inconditionnelle. Sachez cependant que ce n'est pas le comportement par défaut pour les réponses JSON d'ASP.NET MVC, qui répond plutôt avec une chaîne vide, lorsqu'il n'y a pas de données.
la source
if (this.JsonRequestBehavior == JsonRequestBehavior.DenyGet && string.Equals(context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase)) throw new InvalidOperationException(MvcResources.JsonRequest_GetNotAllowed);
? Je pense qu'il faut ajouter cette réponse d'enregistrement (sansMvcResources.JsonRequest_GetNotAllowed
message interne mais avec un message personnalisé) En outre, qu'en est-il de 2 autres vérifications par défaut asp.net mvc - MaxJsonLength et RecursionLimit? En avons-nous besoin si nous utilisons json.net?J'ai implémenté cela sans avoir besoin d'un contrôleur de base ou d'une injection.
J'ai utilisé des filtres d'action pour remplacer le JsonResult par un JsonNetResult.
Dans Global.asax.cs Application_Start (), vous devrez ajouter:
Pour terminer, voici ma classe d'extention JsonNetResult que j'ai récupérée ailleurs et que j'ai légèrement modifiée pour obtenir un support correct de la vapeur:
la source
return Json()
utilise en fait Json.Net.JsonResult
fromJson()
et le convertit en fichierJsonNetResult
. Il le fait en utilisant leas
mot - clé qui renvoie null si la conversion n'est pas possible. Très chouette. 10 points pour Gryffondor![BetterJsonHandler]
:-).Utilisez le convertisseur JSON de Newtonsoft:
la source
Je sais que c'est bien après la réponse à la question, mais j'utilise une approche différente car j'utilise l'injection de dépendances pour instancier mes contrôleurs.
J'ai remplacé IActionInvoker (en injectant la propriété ControllerActionInvoker du contrôleur) par une version qui remplace la méthode InvokeActionMethod.
Cela ne signifie aucun changement dans l'héritage du contrôleur et il peut être facilement supprimé lorsque je mets à niveau vers MVC4 en modifiant l'enregistrement du conteneur DI pour TOUS les contrôleurs
--- EDIT - Mis à jour pour afficher l'enregistrement des conteneurs pour les contrôleurs. J'utilise Unity ici.
la source
En développant la réponse de https://stackoverflow.com/users/183056/sami-beyoglu , si vous définissez le type de contenu, jQuery pourra convertir les données renvoyées en un objet pour vous.
la source
JObject jo = GetJSON(); return Content(jo.ToString(), "application/json");
Ma publication peut aider quelqu'un.
la source
BaseController
, c'était le changement le moins impactant - il suffisait d'ajouter la classe et de mettre à jourBaseController
.J'ai créé une version qui rend les actions de service Web simples et sécurisées. Vous l'utilisez comme ceci:
La classe:
la source