如何在C#asp.net MVC中扩展递归限制

如何在C#asp.net MVC中扩展递归限制,c#,asp.net-mvc,json,C#,Asp.net Mvc,Json,在ASP.NET MVC中,当我尝试通过JSON将数据发送到浏览器时,我遇到了异常RecursionLimit 无论JSON有多大,我都能让它工作。递归限制属性的默认值是100,这意味着它可以序列化嵌套到100个相互引用对象深度的对象 我无法想象你实际上有嵌套那么深的对象,因此产生错误消息的最可能原因是你有一个对象包含对自身的引用,或者两个对象相互引用。由于这会导致子对象的无限链,因此在serialiser中会出现相当于堆栈溢出的情况。使用视图模型来中断递归。不能对递归引用自身的对象进行JSON

在ASP.NET MVC中,当我尝试通过JSON将数据发送到浏览器时,我遇到了异常RecursionLimit


无论JSON有多大,我都能让它工作。

递归限制属性的默认值是100,这意味着它可以序列化嵌套到100个相互引用对象深度的对象


我无法想象你实际上有嵌套那么深的对象,因此产生错误消息的最可能原因是你有一个对象包含对自身的引用,或者两个对象相互引用。由于这会导致子对象的无限链,因此在serialiser中会出现相当于堆栈溢出的情况。

使用视图模型来中断递归。不能对递归引用自身的对象进行JSON序列化。Ayende Rahien对这个问题有一个很好的解释。

当您忽略这些属性时,可以对递归引用自身的对象进行JSON序列化。我的Users类有一个也是用户对象的属性,但我忽略了该属性:

    Users oSuperior;
    [ScriptIgnore(), XmlIgnore()]
    public Users Superior
    {
        get
        {

            if (oSuperior == null)
            {
                oSuperior = new Users();

                if (iIDUserSuperior > 0)
                    oSuperior.Load(iIDUserSuperior);
            }
            return oSuperior;
        }
    }

由于以下配置在ASP.NET MVC中似乎无用:

<system.web.extensions>
  <scripting>
    <webServices>
      <jsonSerialization recursionLimit="1024"/>
    </webServices>
  </scripting>
</system.web.extensions>
与使用MVC的序列化方法(默认递归限制为100)不同:

Json.Encode(@Model)

它可能不是最好的解决方案,但在您需要快速修复的情况下,它确实很容易使用。

似乎Microsoft已在中添加了一些有用的属性,用于在.NET framework 4.5中增加递归限制和最大JSON长度:

public ActionResult GetJson()
{
    var result = Json(obj);
    result.RecursionLimit = 1024;
    result.MaxJsonLength = 8388608;
    return result;
}

因此,现在您可以通过设置这些属性轻松设置JSON对象的“大”程度。

除了上述方法外,您还可以使用JSON.NET提供的方法替换默认JSON序列化:

空值表示没有最大值。默认值为空

例如:


注意:ASP.NET Web API使用此选项。

查看模型是什么意思。你能展示一些代码吗。我真的不明白你想要什么say@Steven斯皮尔伯格,视图模型是您定义的一个类,它只包含给定视图所需的属性。因此,与发送可能包含百分之一百不必要属性和循环引用的实际模型不同,您将编写一个简单的类,该类将从此模型映射并作为Json方法的参数发送到视图。不难想象,我正在尝试序列化一个简单的54层深树结构,使用JavaScript在客户端构建一个图表,并且由于递归限制太小而失败。(@ THOMAS.G.DeVelhana:您可以增加递归限制,但是您应该考虑是否有不同的方式来表示数据。
public ActionResult GetJson()
{
    var result = Json(obj);
    result.RecursionLimit = 1024;
    result.MaxJsonLength = 8388608;
    return result;
}
JsonConvert.SerializeObject(theObject);