Quando restituiamo un JsonResult da una action, il framework utilizza internamente JavaScriptSerializer per serializzare il nostro model. Questo avviene in contrasto con ASP.NET Web API, che sfrutta invece la libreria Json.NET.
In casi semplici, probabilmente non ci accorgeremo mai della differenza. Tuttavia questa situazione risulta particolarmente scomoda nel momento in cui abbiamo un object model condiviso tra MVC e Web API, nel quale magari abbiamo personalizzato le regole di serializzazione tramite gli attributi di Json.NET:
public class Person { [JsonProperty("name")] public string Name { get; set; } }
Per far sì che anche MVC usi questa libreria, l'unica alternativa che abbiamo è quella di creare un ActionResult personalizzato come il seguente:
public class JsonNetResult : ActionResult { public object Data { get; set; } public JsonRequestBehavior JsonRequestBehavior { get; set; } ... }
JsonNetResult è molto semplice e contiene solo due proprietà: una per specificare il contenuto del risultato, l'altra (per uniformità alla versione "ufficiale" JsonResult), permette invece di indicare se le richieste di tipo GET sono ammesse o meno.
Il cuore della classe però è costituito dall'override del metodo ExecuteResult:
public override void ExecuteResult(ControllerContext context) { if (context == null) { throw new ArgumentNullException("context"); } if ((this.JsonRequestBehavior == JsonRequestBehavior.DenyGet) && string.Equals(context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase)) { throw new InvalidOperationException("GET Not allowed"); } HttpResponseBase response = context.HttpContext.Response; response.ContentType = "application/json"; if (Data != null) { JsonTextWriter writer = new JsonTextWriter(response.Output); JsonSerializer serializer = JsonSerializer.Create(); serializer.Serialize(writer, Data); writer.Flush(); } }
Il codice può sembrare corposo, ma in realtà è piuttosto lineare: una volta verificato se la richiesta è di tipo GET e se questa sia ammessa, non facciamo altro che impostare il content type corretto e poi sfruttare gli oggetti JsonSerializer e JsonTextWriter per scrivere sullo stream di risposta. Ovviamente perché questa classe compili, è necessario referenziare il package Json.NET tramite NuGet.
Quando usiamo la versione standard JsonResult in una action, abbiamo a disposizione il metodo Json che rende molto comoda la scrittura del codice:
public ActionResult MyAction() { var model = ... return this.Json(model); }
Se vogliamo rendere l'utilizzo di JsonNetResult altrettanto semplice, possiamo creare un extension method della classe Controller:
public static class JsonNetResultHelper { public static JsonNetResult JsonNet(this Controller controller, object data, JsonRequestBehavior behavior = JsonRequestBehavior.DenyGet) { return new JsonNetResult { Data = data, JsonRequestBehavior = behavior }; } }
A questo punto saremo in grado di utilizzare Json.NET in maniera del tutto analoga a quella "ufficiale":
public ActionResult MyAction() { var model = ... return this.JsonNet(model); }
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Utilizzare Hybrid Cache in .NET 9
Cancellare una run di un workflow di GitHub
Referenziare un @layer più alto in CSS
Selettore CSS :has() e i suoi casi d'uso avanzati
Migliorare la scalabilità delle Azure Function con il Flex Consumption
Supporto ai tipi DateOnly e TimeOnly in Entity Framework Core
Usare i settings di serializzazione/deserializzazione di System.Text.Json di ASP.NET all'interno di un'applicazione non web
Utilizzare il metodo ExceptBy per eseguire operazione di sottrazione tra liste
Disabilitare le run concorrenti di una pipeline di Azure DevOps
Generare HTML a runtime a partire da un componente Razor in ASP.NET Core
Creare una libreria CSS universale: Immagini
Potenziare la ricerca su Cosmos DB con Full Text Search
I più letti di oggi
- .NET Conference Italia 2024 - Milano
- Develop and distribute Azure Functions using K8s and CI/CD
- Disponibile la versione finale di Hyper-V: la virtualizzazione per Windows Server 2008
- Speciale Mastering Entity Framework
- Velocity arriva alla CTP3
- Silverlight Summer: un'estate speciale piena di Style per i controlli Silverlight!
- Disponibile la versione beta di Silverlight 4.0
- Mono 0.13: ora anche web services
- .NET Alerts Software Development Kit