Ist es möglich, JSON.NET als Standard-JSON-Serializer in ASP.NET MVC 3 zu verwenden?
Nach meinen Recherchen scheint die einzige Möglichkeit, dies zu erreichen, darin zu bestehen , ActionResult zu erweitern, da JsonResult in MVC3 nicht virtuell ist ...
Ich hoffte, dass es mit ASP.NET MVC 3 eine Möglichkeit geben würde, einen steckbaren Anbieter für die Serialisierung in JSON anzugeben.
Gedanken?
asp.net-mvc-3
json.net
jsonresult
zam6ak
quelle
quelle
Antworten:
Ich glaube, der beste Weg, dies zu tun, besteht - wie in Ihren Links beschrieben - darin, ActionResult oder JsonResult direkt zu erweitern.
Für die Methode JsonResult, die auf dem Controller nicht virtuell ist und nicht wahr ist, wählen Sie einfach die richtige Überladung. Das funktioniert gut:
EDIT 1 : Eine JsonResult-Erweiterung ...
BEARBEITEN 2 : Ich habe die Prüfung auf Null gemäß den folgenden Vorschlägen entfernt. Das sollte neuere Versionen von JQuery glücklich machen und scheint vernünftig zu sein, da die Antwort dann bedingungslos deserialisiert werden kann. Beachten Sie jedoch, dass dies nicht das Standardverhalten für JSON-Antworten von ASP.NET MVC ist, die eher mit einer leeren Zeichenfolge antworten, wenn keine Daten vorhanden sind.
quelle
if (this.JsonRequestBehavior == JsonRequestBehavior.DenyGet && string.Equals(context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase)) throw new InvalidOperationException(MvcResources.JsonRequest_GetNotAllowed);
? Ich denke, diese Check-in-Antwort muss hinzugefügt werden (ohne interne,MvcResources.JsonRequest_GetNotAllowed
aber mit einer benutzerdefinierten Nachricht). Und was ist mit 2 anderen Standard-MVC-Prüfungen von asp.net - MaxJsonLength und RecursionLimit? Brauchen wir sie, wenn wir json.net verwenden?Ich habe dies ohne die Notwendigkeit eines Basisreglers oder einer Einspritzung implementiert.
Ich habe Aktionsfilter verwendet, um das JsonResult durch ein JsonNetResult zu ersetzen.
In Global.asax.cs Application_Start () müssten Sie Folgendes hinzufügen:
Der Vollständigkeit halber ist hier meine JsonNetResult-Erweiterungsklasse, die ich von einem anderen Ort übernommen und leicht modifiziert habe, um die richtige Unterstützung für das Dämpfen zu erhalten:
quelle
return Json()
Lässt es so sein, dass der native Benutzer tatsächlich Json.Net verwendet.JsonResult
von abJson()
und konvertiert es in einJsonNetResult
. Dies geschieht mit demas
Schlüsselwort, das null zurückgibt, wenn die Konvertierung nicht möglich ist. Sehr geschickt. 10 Punkte für Gryffindor![BetterJsonHandler]
:-).Verwenden Sie den JSON-Konverter von Newtonsoft:
quelle
Ich weiß, dass dies gut ist, nachdem die Frage beantwortet wurde, aber ich verwende einen anderen Ansatz, da ich die Abhängigkeitsinjektion verwende, um meine Controller zu instanziieren.
Ich habe den IActionInvoker (durch Einfügen der ControllerActionInvoker-Eigenschaft des Controllers) durch eine Version ersetzt, die die InvokeActionMethod-Methode überschreibt.
Dies bedeutet keine Änderung der Controller-Vererbung und kann beim Upgrade auf MVC4 leicht entfernt werden, indem die Registrierung des DI-Containers für ALLE Controller geändert wird
--- BEARBEITEN - Aktualisiert, um die Containerregistrierung für Controller anzuzeigen. Ich benutze hier Unity.
quelle
Wenn Sie die Antwort von https://stackoverflow.com/users/183056/sami-beyoglu erweitern und den Inhaltstyp festlegen, kann jQuery die zurückgegebenen Daten in ein Objekt für Sie konvertieren.
quelle
JObject jo = GetJSON(); return Content(jo.ToString(), "application/json");
Mein Beitrag kann jemandem helfen.
quelle
BaseController
, war dies die Änderung mit den geringsten Auswirkungen - ich musste nur die Klasse hinzufügen und aktualisierenBaseController
.Ich habe eine Version erstellt, die Webdienstaktionen typsicher und einfach macht. Sie verwenden es so:
Die Klasse:
quelle