Bei einer meiner Controller-Aktionen gebe ich ein sehr großes zurück JsonResult
, um ein Raster zu füllen.
Ich erhalte die folgende InvalidOperationException
Ausnahme:
Fehler während der Serialisierung oder Deserialisierung mit dem JSON JavaScriptSerializer. Die Länge der Zeichenfolge überschreitet den in der Eigenschaft maxJsonLength festgelegten Wert.
Das Setzen der maxJsonLength
Eigenschaft web.config
auf einen höheren Wert zeigt leider keine Auswirkung.
<system.web.extensions>
<scripting>
<webServices>
<jsonSerialization maxJsonLength="2147483644"/>
</webServices>
</scripting>
</system.web.extensions>
Ich möchte es nicht als Zeichenfolge zurückgeben, wie in dieser SO-Antwort erwähnt.
Bei meinen Recherchen bin ich auf diesen Blog-Beitrag gestoßen, in dem das Schreiben eines eigenen ActionResult
(z. B. LargeJsonResult : JsonResult
) empfohlen wird, um dieses Verhalten zu umgehen.
Ist das dann die einzige Lösung?
Ist dies ein Fehler in ASP.NET MVC?
Vermisse ich etwas
Jede Hilfe wäre sehr dankbar.
quelle
Antworten:
Es scheint, dass dies in MVC4 behoben wurde.
Sie können dies tun, was für mich gut funktioniert hat:
quelle
Sie können auch
ContentResult
wie hier vorgeschlagen anstelle von Unterklassen verwendenJsonResult
.quelle
Leider wird die Einstellung web.config von der Standardimplementierung von JsonResult ignoriert . Ich denke, Sie müssen ein benutzerdefiniertes JSON-Ergebnis implementieren, um dieses Problem zu beheben.
quelle
Keine benutzerdefinierte Klasse erforderlich. Das ist alles was benötigt wird:
Wo
Result
sind die Daten, die Sie serialisieren möchten?quelle
Wenn Sie Json.NET zum Generieren der
json
Zeichenfolge verwenden, muss keinMaxJsonLength
Wert festgelegt werden.quelle
Ich habe das Problem gelöst, indem ich diesem Link gefolgt bin
quelle
Ich bin überrascht, dass niemand vorgeschlagen hat, einen Ergebnisfilter zu verwenden. Dies ist der sauberste Weg, um sich global in die Aktions- / Ergebnis-Pipeline einzubinden:
Registrieren Sie dann eine Instanz dieser Klasse mit
GlobalFilters.Filters
:quelle
Sie können versuchen, in Ihrem LINQ-Ausdruck nur die Felder zu definieren, die Sie benötigen.
Beispiel. Stellen Sie sich vor, Sie haben ein Modell mit ID, Name, Telefon und Bild (Byte-Array) und müssen von json in eine Auswahlliste laden.
LINQ-Abfrage:
Das Problem hier ist " select u ", das alle Felder erhält. Also, wenn Sie große Bilder haben, booomm.
Wie löst man? sehr, sehr einfach.
Am besten wählen Sie nur das Feld aus, das Sie verwenden möchten.
Merken. Dies ist ein einfacher Tipp, kann aber vielen ASP.NET MVC-Entwicklern helfen.
quelle
Alternative ASP.NET MVC 5 Fix:
In meinem Fall ist der Fehler während der Anfrage aufgetreten. Der beste Ansatz in meinem Szenario ist das Ändern des tatsächlichen Ansatzes,
JsonValueProviderFactory
der den Fix auf das globale Projekt anwendet und durch Bearbeiten derglobal.cs
Datei als solche erfolgen kann.Fügen Sie einen web.config-Eintrag hinzu:
und erstellen Sie dann die beiden folgenden Klassen
Dies ist im Grunde eine exakte Kopie der Standardimplementierung in,
System.Web.Mvc
jedoch mit dem Zusatz eines konfigurierbaren Web.config-Appsetting-Wertsaspnet:MaxJsonLength
.quelle
Nichts davon hat für mich geklappt, bis ich die Aktion als geändert habe
[HttpPost]
. und machte den Ajax-Typ alsPOST
.Und der Ajax ruft als
quelle
War das Update für mich in MVC 4.
quelle
Sie müssen manuell aus dem Konfigurationsabschnitt lesen, bevor Ihr Code ein JsonResult-Objekt zurückgibt. Lesen Sie einfach in einer Zeile aus web.config:
Stellen Sie sicher, dass Sie das Konfigurationselement in web.config definiert haben
quelle
das hat bei mir funktioniert
quelle
Es gibt einen anderen Fall: Daten werden vom Client an den Server gesendet. Wenn Sie die Controller-Methode und das Controller-Modell verwenden, ist dies enorm:
Das System löst eine Ausnahme wie diese aus: "Fehler beim Serialisieren oder Deserialisieren mit dem JSON JavaScriptSerializer. Die Länge der Zeichenfolge überschreitet den in der Eigenschaft maxJsonLength festgelegten Wert. Parametername: Eingabe"
Nur das Ändern der Web.config-Einstellungen reicht in diesem Fall nicht aus. Sie können den mvc json-Serializer zusätzlich überschreiben, um große Datenmodellgrößen zu unterstützen, oder das Modell manuell von Request deserialisieren. Ihre Controller-Methode wird:
quelle
Sie können diesen Code in cshtml einfügen, wenn Sie die Ansicht vom Controller zurückgeben und die Länge der View-Bag-Daten erhöhen möchten, während Sie in json in cshtml codieren
Jetzt
dataJsonOnActionGrid1
wird auf js Seite zugänglich sein und Sie erhalten das richtige Ergebnis.Vielen Dank
quelle