Czy można używać JSON.NET jako domyślnego serializatora JSON w ASP.NET MVC 3?
Według moich badań wydaje się, że jedynym sposobem na osiągnięcie tego jest rozszerzenie ActionResult, ponieważ JsonResult w MVC3 nie jest wirtualny ...
Miałem nadzieję, że z ASP.NET MVC 3 będzie sposób na określenie podłączalnego dostawcy do serializacji do JSON.
Myśli?
asp.net-mvc-3
json.net
jsonresult
zam6ak
źródło
źródło
Odpowiedzi:
Uważam, że najlepszym sposobem na to jest - jak opisano w twoich linkach - rozszerzenie ActionResult lub bezpośrednie rozszerzenie JsonResult.
Jeśli chodzi o metodę JsonResult, która nie jest wirtualna na kontrolerze, to nie jest prawda, po prostu wybierz odpowiednie przeciążenie. To działa dobrze:
EDYCJA 1 : rozszerzenie JsonResult ...
EDYCJA 2 : Usunąłem sprawdzanie danych, które są zerowe, zgodnie z poniższymi sugestiami. Powinno to uszczęśliwić nowsze wersje JQuery i wydaje się rozsądne, ponieważ odpowiedź może zostać bezwarunkowo zdeserializowana. Należy jednak pamiętać, że nie jest to domyślne zachowanie dla odpowiedzi JSON z ASP.NET MVC, które raczej reagują pustym ciągiem, gdy nie ma danych.
źródło
if (this.JsonRequestBehavior == JsonRequestBehavior.DenyGet && string.Equals(context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase)) throw new InvalidOperationException(MvcResources.JsonRequest_GetNotAllowed);
? Myślę, że trzeba dodać to sprawdzenie w odpowiedzi (bez wewnętrznego,MvcResources.JsonRequest_GetNotAllowed
ale z jakimś niestandardowym komunikatem). A co z 2 innymi domyślnymi kontrolami mvc asp.net - MaxJsonLength i RecursionLimit? Czy potrzebujemy ich, jeśli używamy json.net?Zaimplementowałem to bez potrzeby bazowego kontrolera czy wtrysku.
Użyłem filtrów akcji, aby zamienić JsonResult na JsonNetResult.
W Global.asax.cs Application_Start () należałoby dodać:
Dla porządku, oto moja klasa rozszerzeń JsonNetResult, którą odebrałem z innego miejsca i którą nieznacznie zmodyfikowałem, aby uzyskać poprawną obsługę parowania:
źródło
return Json()
w efekcie używa Json.Net.JsonResult
fromJson()
i konwertuje go naJsonNetResult
. Czyni to za pomocąas
słowa kluczowego, które zwraca wartość null, jeśli konwersja nie jest możliwa. Bardzo fajnie. 10 punktów dla Gryffindoru![BetterJsonHandler]
:-).Użyj konwertera JSON firmy Newtonsoft:
źródło
Wiem, że jest to dobrze po udzieleniu odpowiedzi na pytanie, ale używam innego podejścia, ponieważ używam iniekcji zależności do tworzenia instancji moich kontrolerów.
Zastąpiłem IActionInvoker (poprzez wstrzyknięcie właściwości ControllerActionInvoker kontrolera) wersją, która zastępuje metodę InvokeActionMethod.
Oznacza to brak zmian w dziedziczeniu kontrolerów i można je łatwo usunąć podczas aktualizacji do MVC4, zmieniając rejestrację kontenera DI dla WSZYSTKICH kontrolerów
--- EDYCJA - Zaktualizowano, aby pokazywać rejestrację kontenera dla kontrolerów. Używam tutaj Unity.
źródło
Rozwijając odpowiedź z https://stackoverflow.com/users/183056/sami-beyoglu , jeśli ustawisz typ treści, to jQuery będzie w stanie przekonwertować zwrócone dane na obiekt dla Ciebie.
źródło
JObject jo = GetJSON(); return Content(jo.ToString(), "application/json");
Mój post może komuś pomóc.
źródło
BaseController
, była to najmniejsza zmiana wpływu - wystarczyło dodać klasę i aktualizacjęBaseController
.Stworzyłem wersję, która sprawia, że akcje usług internetowych są bezpieczne i proste. Używasz tego w ten sposób:
Klasa:
źródło