You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解决.cshtml中Json.Encode超出maxJsonLength限制的报错问题

这个问题我之前帮不少开发者踩过坑,核心就是默认的Json.Encode用的JavaScriptSerializer有内置长度限制,而且默认的全局配置确实管不到它——毕竟它是直接实例化的序列化器,不会读取Web.config里的设置。下面给你几个实打实的可行方案,包括怎么给Json.Encode手动设置maxJsonLength:

方案1:自定义扩展方法,给序列化器手动设maxJsonLength

既然默认的Json.Encode不让我们改长度,那我们自己写一个替代它的方法就行,本质就是手动初始化JavaScriptSerializer并设置最大长度:

  1. 在你的项目里新建一个静态类(比如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);
    }
}
  1. 在你的cshtml页面里,引用这个类所在的命名空间(如果不在默认命名空间的话),然后替换原来的代码:
<script>
var typeVM = JSON.parse('@Html.JsonEncodeWithMaxLength(Model.typeVM)');
</script>

这样就直接绕开了默认的长度限制,完全由你自己控制序列化的最大长度。

方案2:改用Newtonsoft.Json(Json.NET)替代默认序列化器

默认的JavaScriptSerializer比较老旧,功能有限,而Newtonsoft.Json(也就是大家常说的Json.NET)是.NET生态里最常用的JSON库,不仅没有默认的长度限制,还支持更多序列化特性:

  1. 先通过NuGet安装Newtonsoft.Json包(如果还没装的话)。

  2. 你可以直接在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:33:29