【问题标题】:A circular reference was detected while serializing an object of type?序列化类型对象时检测到循环引用?
【发布时间】:2012-12-01 13:49:38
【问题描述】:

DB MetersTree 表

id       text   parentId    state

 0       root          0     open
 1    level 1          1     open
 2    level 1          1     open
 ...     

控制器

public ActionResult GetDemoTree()
{
    OsosPlus2DbEntities entity = new OsosPlus2DbEntities();
    MetersTree meterTree = entity.MetersTree.FirstOrDefault();

    return Json(meterTree, JsonRequestBehavior.AllowGet);
}

应采用的数据格式(例如)

[{  
    "id": 1,  
    "text": "Node 1",  
    "state": "closed",  
    "children": [{  
        "id": 11,  
        "text": "Node 11"  
    },{  
        "id": 12,  
        "text": "Node 12"  
    }]  
},{  
    "id": 2,  
    "text": "Node 2",  
    "state": "closed"  
}]  

如何创建树 Json 数据?如果我用它的关系编写 MetersTree,我会得到标题中定义的错误。

【问题讨论】:

  • 能显示 MetersTree 模型的内容吗?
  • 它是由我上面写的 db_table 中的 EntityFramework 生成的。此外,parentId 对 id 的引用。我知道是什么问题,但我不知道,我该如何解决。

标签: asp.net-mvc json jquery-easyui


【解决方案1】:

您需要中断由于 EF 类中的导航属性而被拾取的循环引用。

您可以将结果映射到这样的匿名类型,尽管这是未经测试的:

public ActionResult GetDemoTree()
{
    OsosPlus2DbEntities entity = new OsosPlus2DbEntities();
    MetersTree meterTree = entity.MetersTree.FirstOrDefault();

    var result = from x in meterTree
           select new 
            {
            x.id,
            x.text,
            x.state,
            children = x.children.Select({
                c => new {
                    c.id,
                    c.text
                })
         };

    return Json(result, JsonRequestBehavior.AllowGet);
}

【讨论】:

  • 好的,看看我的更新。我在这里瞎了眼,但我已经将孩子们选择到另一个匿名类型中,该类型删除了循环引用
  • 您的建议有效。但有一个问题。事实上,我需要循环引用来获取树的最后一个节点。在您的建议中,我可以获得两级树。在我的树中,可能有很多级别。感谢回复
  • 我想知道,我是否应该获取所有树节点,并在 foreach 中动态创建树?
  • 好的,我想我回答了你的问题,但你的问题不太正确:) - 很高兴你解决了。
  • 返回 View 而不是 Json 时如何解决?
【解决方案2】:

我是这样解决的:

查看模型

public class MetersTreeViewModel
{
    public int id { get; set; }
    public string text { get; set; }
    public string state { get; set; }
    public bool @checked { get; set; }
    public string attributes { get; set; }
    public List<MetersTreeViewModel> children { get; set; }
}

控制器

public ActionResult GetMetersTree()
{
    MetersTree meterTreeFromDb = entity.MetersTree.SingleOrDefault(x => x.sno == 5); //in my db this is the root.
    List<MetersTreeViewModel> metersTreeToView = buildTree(meterTreeFromDb.Children).ToList();

    return Json(metersTreeToView, JsonRequestBehavior.AllowGet);
}

构建树方法

private List<MetersTreeViewModel> BuildTree(IEnumerable<MetersTree> treeFromDb)
{
    List<MetersTreeViewModel> metersTreeNodes = new List<MetersTreeViewModel>();
    foreach (var node in treeFromDb)
    {
        if (node.Children.Any())
        {
            metersTreeNodes.Add(new MetersTreeViewModel
            {
                id = node.sno,
                text = node.Text,
                state = node.Text,
                children = BuildTree(node.Children)
            });
        }
        else {
            metersTreeNodes.Add(new MetersTreeViewModel
            {
                id = node.sno,
                text = node.Text,
                state = node.Text
            });
        }
    }

    return metersTreeNodes;
}

感谢所有对...感兴趣的人...

【讨论】:

    猜你喜欢
    • 2012-05-04
    • 1970-01-01
    • 2015-01-21
    • 2010-11-12
    • 2013-04-23
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多