Dans l'une de mes actions de contrôleur, je retourne un très grand JsonResult
pour remplir une grille.
Je reçois l' InvalidOperationException
exception suivante :
Erreur lors de la sérialisation ou de la désérialisation à l'aide de JSON JavaScriptSerializer. La longueur de la chaîne dépasse la valeur définie sur la propriété maxJsonLength.
La définition de la maxJsonLength
propriété dans web.config
une valeur plus élevée ne montre malheureusement aucun effet.
<system.web.extensions>
<scripting>
<webServices>
<jsonSerialization maxJsonLength="2147483644"/>
</webServices>
</scripting>
</system.web.extensions>
Je ne veux pas le renvoyer sous forme de chaîne comme mentionné dans cette réponse SO.
Dans mes recherches, je suis tombé sur ce billet de blog où il est recommandé d'en écrire un ActionResult
(par exemple LargeJsonResult : JsonResult
) pour contourner ce comportement.
Est-ce donc la seule solution?
S'agit-il d'un bogue dans ASP.NET MVC?
Est-ce que je manque quelque chose?
Toute aide sera très appréciée.
la source
Réponses:
Il semble que cela ait été corrigé dans MVC4.
Vous pouvez faire ceci, qui a bien fonctionné pour moi:
la source
Vous pouvez également utiliser
ContentResult
comme suggéré ici au lieu de sous-classerJsonResult
.la source
Malheureusement, le paramètre web.config est ignoré par l'implémentation par défaut de JsonResult . Je suppose donc que vous devrez implémenter un résultat json personnalisé pour résoudre ce problème.
la source
Pas besoin de classe personnalisée. C'est tout ce qu'il faut:
où
Result
sont ces données que vous souhaitez sérialiser.la source
Si vous utilisez Json.NET pour générer la
json
chaîne, il n'est pas nécessaire de définir laMaxJsonLength
valeur.la source
J'ai résolu le problème en suivant ce lien
la source
Je suis surpris que personne n'ait suggéré d'utiliser un filtre de résultat. C'est le moyen le plus propre de se connecter globalement au pipeline action / résultat:
Ensuite, enregistrez une instance de cette classe en utilisant
GlobalFilters.Filters
:la source
Vous pouvez essayer de définir dans votre expression LINQ uniquement les champs dont vous aurez besoin.
Exemple. Imaginez que vous ayez un modèle avec un identifiant, un nom, un téléphone et une image (tableau d'octets) et que vous deviez charger depuis json dans une liste de sélection.
Requête LINQ:
Le problème ici est " sélectionnez u " qui obtient tous les champs. Donc, si vous avez de grandes photos, booomm.
Comment résoudre? très, très simple.
La meilleure pratique consiste à sélectionner uniquement le champ que vous utiliserez.
Rappelles toi. C'est une astuce simple, mais qui peut aider de nombreux développeurs ASP.NET MVC.
la source
Correction alternative d'ASP.NET MVC 5:
Dans mon cas, l'erreur s'est produite lors de la demande. La meilleure approche dans mon scénario consiste à modifier le réel
JsonValueProviderFactory
qui applique le correctif au projet global et peut être fait en éditant leglobal.cs
fichier en tant que tel.ajoutez une entrée web.config:
puis créez les deux classes suivantes
Il s'agit essentiellement d'une copie exacte de l'implémentation par défaut trouvée dans
System.Web.Mvc
mais avec l'ajout d'une valeur de paramétrage d'application web.config configurableaspnet:MaxJsonLength
.la source
Rien de ce qui précède n'a fonctionné pour moi jusqu'à ce que je change l'action en tant que
[HttpPost]
. et a fait le type ajax commePOST
.Et l'appel ajax comme
la source
Était le correctif pour moi dans MVC 4.
la source
Vous devez lire manuellement la section de configuration avant que votre code ne renvoie un objet JsonResult. Lisez simplement à partir de web.config en une seule ligne:
Assurez-vous d'avoir défini l'élément de configuration dans web.config
la source
cela a fonctionné pour moi
la source
il y a un autre cas - les données sont envoyées du client au serveur. lorsque vous utilisez la méthode du contrôleur et le modèle est énorme:
Le système lève une exception comme celle-ci "Erreur lors de la sérialisation ou de la désérialisation à l'aide de JSON JavaScriptSerializer. La longueur de la chaîne dépasse la valeur définie sur la propriété maxJsonLength. Nom du paramètre: entrée"
Seule la modification des paramètres Web.config n'est pas suffisante pour aider dans ce cas. Vous pouvez en outre remplacer le sérialiseur mvc json pour prendre en charge des tailles de modèle de données énormes ou désérialiser manuellement le modèle de Request. Votre méthode de contrôleur devient:
la source
Vous pouvez mettre ce code dans cshtml si vous renvoyez la vue du contrôleur et que vous souhaitez augmenter la longueur des données du sac de vue lors de l'encodage en json dans cshtml
Maintenant,
dataJsonOnActionGrid1
sera accessible sur la page js et vous obtiendrez un résultat correct.Merci
la source