En una de mis acciones de controlador, estoy devolviendo un muy grande JsonResult
para llenar una cuadrícula.
Recibo la siguiente InvalidOperationException
excepción:
Error durante la serialización o deserialización con JSON JavaScriptSerializer. La longitud de la cadena excede el valor establecido en la propiedad maxJsonLength.
Desafortunadamente, establecer la maxJsonLength
propiedad en web.config
un valor superior no muestra ningún efecto.
<system.web.extensions>
<scripting>
<webServices>
<jsonSerialization maxJsonLength="2147483644"/>
</webServices>
</scripting>
</system.web.extensions>
No quiero volver a pasarlo como una cadena como se menciona en esta respuesta SO.
En mi investigación, me encontré con esta publicación de blog donde se recomienda escribir uno propio ActionResult
(por ejemplo LargeJsonResult : JsonResult
) para evitar este comportamiento.
¿Es esta la única solución?
¿Es esto un error en ASP.NET MVC?
¿Me estoy perdiendo de algo?
Cualquier ayuda sería muy apreciada.
fuente
Respuestas:
Parece que esto se ha solucionado en MVC4.
Puedes hacer esto, que funcionó bien para mí:
fuente
También puede usar
ContentResult
como se sugiere aquí en lugar de subclasificarJsonResult
.fuente
Lamentablemente, la configuración predeterminada de JsonResult ignora la configuración de web.config . Así que supongo que deberá implementar un resultado json personalizado para superar este problema.
fuente
No hay necesidad de una clase personalizada. Esto es todo lo que se necesita:
¿Dónde
Result
están los datos que desea serializar?fuente
Si usa Json.NET para generar la
json
cadena, no necesita establecer elMaxJsonLength
valor.fuente
Resolví el problema siguiendo este enlace.
fuente
Me sorprende que nadie haya sugerido usar un filtro de resultados. Esta es la forma más limpia de engancharse globalmente a la línea de acción / resultado:
Luego, registre una instancia de esa clase usando
GlobalFilters.Filters
:fuente
Puede intentar definir en su expresión LINQ solo los campos que necesitará.
Ejemplo. Imagine que tiene un Modelo con Id, Nombre, Teléfono e Imagen (matriz de bytes) y necesita cargar desde json en una lista de selección.
Consulta LINQ:
El problema aquí es " seleccionar u " que obtiene todos los campos. Entonces, si tienes fotos grandes, booomm.
¿Cómo resolver? Muy, muy simple.
Las mejores prácticas son seleccionar solo el campo que usará.
Recuerda. Este es un consejo simple, pero puede ayudar a muchos desarrolladores de ASP.NET MVC.
fuente
Solución alternativa de ASP.NET MVC 5:
En mi caso, el error estaba ocurriendo durante la solicitud. El mejor enfoque en mi escenario es modificar el real
JsonValueProviderFactory
que aplica la corrección al proyecto global y puede hacerse editando elglobal.cs
archivo como tal.agregue una entrada web.config:
y luego crea las dos clases siguientes
Esto es básicamente una copia exacta de la implementación predeterminada que se encuentra en
System.Web.Mvc
pero con la adición de un valor configurable de configuración web.configaspnet:MaxJsonLength
.fuente
Nada de lo anterior funcionó para mí hasta que cambié la Acción como
[HttpPost]
. e hizo el tipo ajax comoPOST
.Y la llamada ajax como
fuente
Fue la solución para mí en MVC 4.
fuente
Debe leer la sección de configuración manualmente antes de que su código devuelva un objeto JsonResult. Simplemente lea desde web.config en una sola línea:
Asegúrese de haber definido el elemento de configuración en web.config
fuente
esto funcionó para mí
fuente
hay otro caso: los datos se envían del cliente al servidor. cuando está utilizando el método del controlador y el modelo es enorme:
el sistema arroja una excepción como esta "Error durante la serialización o deserialización utilizando JSON JavaScriptSerializer. La longitud de la cadena excede el valor establecido en la propiedad maxJsonLength. Nombre del parámetro: entrada"
Solo cambiar la configuración de Web.config no es suficiente para ayudar en este caso. También puede anular el serializador mvc json para admitir grandes tamaños de modelo de datos o deserializar manualmente el modelo desde Solicitud. Su método de controlador se convierte en:
fuente
Puede poner este código en cshtml si está devolviendo la vista desde el controlador y desea aumentar la longitud de los datos de la bolsa de vista mientras codifica en json en cshtml
Ahora,
dataJsonOnActionGrid1
será accesible en la página js y obtendrá el resultado adecuado.Gracias
fuente