解决.cshtml中Json.Encode超出maxJsonLength限制的报错问题
这个问题我之前帮不少开发者踩过坑,核心就是默认的Json.Encode用的JavaScriptSerializer有内置长度限制,而且默认的全局配置确实管不到它——毕竟它是直接实例化的序列化器,不会读取Web.config里的设置。下面给你几个实打实的可行方案,包括怎么给Json.Encode手动设置maxJsonLength:
方案1:自定义扩展方法,给序列化器手动设maxJsonLength
既然默认的Json.Encode不让我们改长度,那我们自己写一个替代它的方法就行,本质就是手动初始化JavaScriptSerializer并设置最大长度:
- 在你的项目里新建一个静态类(比如
HtmlHelperExtensions.cs),写这个扩展方法:
using System.Web; using System.Web.Mvc; using System.Web.Script.Serialization; public static class HtmlHelperExtensions { // 可以自定义默认的max长度,这里设为int的最大值,也可以根据需求调整 public static IHtmlString JsonEncodeWithMaxLength(this HtmlHelper helper, object value, int maxJsonLength = int.MaxValue) { var serializer = new JavaScriptSerializer(); serializer.MaxJsonLength = maxJsonLength; var jsonString = serializer.Serialize(value); return helper.Raw(jsonString); } }
- 在你的cshtml页面里,引用这个类所在的命名空间(如果不在默认命名空间的话),然后替换原来的代码:
<script> var typeVM = JSON.parse('@Html.JsonEncodeWithMaxLength(Model.typeVM)'); </script>
这样就直接绕开了默认的长度限制,完全由你自己控制序列化的最大长度。
方案2:改用Newtonsoft.Json(Json.NET)替代默认序列化器
默认的JavaScriptSerializer比较老旧,功能有限,而Newtonsoft.Json(也就是大家常说的Json.NET)是.NET生态里最常用的JSON库,不仅没有默认的长度限制,还支持更多序列化特性:
先通过NuGet安装Newtonsoft.Json包(如果还没装的话)。
你可以直接在cshtml里调用它的序列化方法,或者写个扩展方法方便复用:
// 可选的扩展方法,方便在多个页面调用 public static class HtmlHelperExtensions { public static IHtmlString JsonNetEncode(this HtmlHelper helper, object value) { var jsonString = Newtonsoft.Json.JsonConvert.SerializeObject(value); return helper.Raw(jsonString); } }
然后在cshtml里替换代码:
<script> // 用扩展方法的写法 var typeVM = JSON.parse('@Html.JsonNetEncode(Model.typeVM)'); // 或者不用扩展方法,直接写 var typeVM = JSON.parse('@Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(Model.typeVM))'); </script>
这个方案不仅能解决长度问题,后续如果需要自定义序列化规则(比如忽略某些字段、格式化日期)也更方便。
方案3:拆分数据,从根源减少序列化体积
如果你的typeVM数据量实在太大,哪怕取消了长度限制,前端加载和解析这么大的JSON也可能卡顿。这种情况下,更推荐从数据本身入手:
- 只序列化前端真正需要的字段:后端创建一个专门的DTO(数据传输对象),只包含页面需要的属性,排除那些冗余的、后端内部用的字段。
- 分批加载:把数据拆分成多个部分,比如分页,前端先加载第一部分,用户触发操作后再通过AJAX请求加载剩下的。
- 异步加载:把非核心数据存在后端缓存,页面加载完成后再通过AJAX请求获取,而不是一次性把所有数据序列化到页面里。
方案4:关于Web.config配置的补充说明
你提到Web.config的配置只对Web服务生效,这点是对的——这个配置是给System.Web.Services下的Web服务用的,对于Json.Encode这种直接实例化JavaScriptSerializer的场景完全不起作用,所以不推荐依赖这个配置来解决问题。不过还是贴出来避免混淆:
<configuration> <system.web.extensions> <scripting> <webServices> <jsonSerialization maxJsonLength="2147483647"/> </webServices> </scripting> </system.web.extensions> </configuration>
这个配置只会影响ASP.NET MVC的JsonResult和传统的ASMX Web服务,对我们当前的场景没用。
内容的提问来源于stack exchange,提问作者Sameer

