Json序列化异常

Json序列化异常,json,asp.net-mvc-4,json.net,Json,Asp.net Mvc 4,Json.net,模型之间的关系是:X有许多Y;Y有许多Z: class X { int Id { get; set; } [JsonIgnore] IList<Y> Y { get; set; } } class Y { int Id { get; set; } X x { get; set; } [JsonIgnore] IList<Z> Z { get; set; } } class Z { int Id { ge

模型之间的关系是:X有许多Y;Y有许多Z:

class X 
{
    int Id { get; set; }
    [JsonIgnore]
    IList<Y> Y { get; set; }
}

class Y
{
    int Id { get; set; }
    X x { get; set; }
    [JsonIgnore]
    IList<Z> Z { get; set; }
}

class Z
{
    int Id { get; set; }
    Y y { get; set; }
}

public class YBinder : DefaultModelBinder
{
    readonly IQuizRepository _quizRepository = DependencyResolver.Current.GetService<IQuizRepository>();

    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var y = (Y)base.BindModel(controllerContext, bindingContext);
        if (problem.Chapter != null)
        {
            y.X = _quizRepository.getX(y.X.Id);
        }
        return y;
    }
}

public class ZBinder : DefaultModelBinder
{ 
    readonly IQuizRepository _quizRepository = DependencyResolver.Current.GetService<IQuizRepository>();

    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var z = (Z)base.BindModel(controllerContext, bindingContext);
        if (z.Y != null)
        {
            z.Y = _quizRepository.getY(z.Y.Id);
        }
        return z;
    }
}
JSON的问题是somwewhere;当我将
[JsonIgnore]
放入类Z中进行调试时 然后网格加载时不会出现异常,否则它会给出
Newtonsoft.Json.JsonSerializationException

class Z
{
    int Id { get; set; }
    [JsonIgnore]          // this removes exception but then I cant bind y in grid
    Y y { get; set; }
}

有人能帮我找出问题出在哪里吗?

您的模型中有循环依赖关系,您不能用JSON序列化这样的对象图,因为JSON格式不支持它。您必须以这种方式重新思考您的模型,从而打破循环依赖关系。想一想您需要传递给视图的唯一信息是什么,然后将域模型展平为一个简单的视图模型。最后,将此展开视图模型传递给视图。

感谢您的回复,我理解您的简单视图模型观点,可能我可以找到解决方案,但我无法理解循环依赖性在哪里?模型之间的关系是简单的x->y->z,我使用JsonIgnore来确保父级和子级中只有一个类负责序列化数据。如果你有时间,你能给我解释一下这一点吗。
class Z
{
    int Id { get; set; }
    [JsonIgnore]          // this removes exception but then I cant bind y in grid
    Y y { get; set; }
}