¿Es posible usar JSON.NET como serializador JSON predeterminado en ASP.NET MVC 3?
Según mi investigación, parece que la única forma de lograr esto es extender ActionResult ya que JsonResult en MVC3 no es virtual ...
Esperaba que con ASP.NET MVC 3 hubiera una forma de especificar un proveedor conectable para serializar a JSON.
Pensamientos
asp.net-mvc-3
json.net
jsonresult
zam6ak
fuente
fuente
Respuestas:
Creo que la mejor manera de hacerlo es, como se describe en sus enlaces, extender ActionResult o extender JsonResult directamente.
En cuanto al método JsonResult que no es virtual en el controlador, eso no es cierto, simplemente elija la sobrecarga correcta. Esto funciona bien:
EDITAR 1 : Una extensión JsonResult ...
EDITAR 2 : eliminé la verificación de que los datos eran nulos según las sugerencias a continuación. Eso debería hacer felices a las versiones más nuevas de JQuery y parece lo más sensato, ya que la respuesta se puede deserializar incondicionalmente. Sin embargo, tenga en cuenta que este no es el comportamiento predeterminado para las respuestas JSON de ASP.NET MVC, que más bien responde con una cadena vacía, cuando no hay datos.
fuente
if (this.JsonRequestBehavior == JsonRequestBehavior.DenyGet && string.Equals(context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase)) throw new InvalidOperationException(MvcResources.JsonRequest_GetNotAllowed);
? Creo que es necesario agregar esta respuesta de verificación (sin internaMvcResources.JsonRequest_GetNotAllowed
pero con algún mensaje personalizado) Además, ¿qué pasa con otras 2 verificaciones de mvc de asp.net predeterminadas: MaxJsonLength y RecursionLimit? ¿Los necesitamos si usamos json.net?Implementé esto sin la necesidad de un controlador base o inyección.
Usé filtros de acción para reemplazar el JsonResult con un JsonNetResult.
En Global.asax.cs Application_Start () necesitaría agregar:
Para completar, aquí está mi clase de extensión JsonNetResult que recogí de otro lugar y que modifiqué ligeramente para obtener el soporte de vaporización correcto:
fuente
return Json()
utilice Json.Net.JsonResult
deJson()
y lo convierte en unJsonNetResult
. Lo hace utilizando laas
palabra clave que devuelve nulo si la conversión no es posible. Muy ingenioso. ¡10 puntos para Gryffindor![BetterJsonHandler]
:-).Utilice el convertidor JSON de Newtonsoft:
fuente
Sé que esto sucede mucho después de que se haya respondido la pregunta, pero estoy usando un enfoque diferente ya que estoy usando la inyección de dependencia para crear instancias de mis controladores.
Reemplacé IActionInvoker (inyectando la propiedad ControllerActionInvoker del controlador) con una versión que anula el método InvokeActionMethod.
Esto significa que no hay cambios en la herencia del controlador y se puede eliminar fácilmente cuando actualizo a MVC4 modificando el registro del contenedor DI para TODOS los controladores
--- EDITAR: actualizado para mostrar el registro de contenedores para los controladores. Estoy usando Unity aquí.
fuente
Ampliando la respuesta de https://stackoverflow.com/users/183056/sami-beyoglu , si establece el tipo de contenido, jQuery podrá convertir los datos devueltos en un objeto para usted.
fuente
JObject jo = GetJSON(); return Content(jo.ToString(), "application/json");
Mi publicación puede ayudar a alguien.
fuente
BaseController
, este fue el cambio de menor impacto: solo tuve que agregar la clase y actualizarBaseController
.Hice una versión que hace que las acciones de servicios web sean seguras y sencillas. Lo usas así:
La clase:
fuente