2012-12-13 54 views
1

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,我會得到標題中定義的錯誤。

+2

您可以顯示MetersTree模型的內容? – Pbirkoff

+0

它由EntitiyFramework從上面編寫的db_table生成。另外,parentId參考id。我知道是什麼問題,但我不知道,我該如何解決它。 –

回答

1

我解決了它這樣的:

視圖模型

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); 
} 

BuildTree方法

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; 
} 

感謝所有誰感興趣的......

3

由於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); 
} 
+0

相同的結果.... –

+0

好的,看我的更新。我在這裏盲注,但我已經選擇了另一個匿名類型的孩子,刪除了您的建議正在工作的循環引用 – Tr1stan

+0

。但有一個問題。事實上,我需要循環引用來獲取樹的最後一個節點。在你的建議中,我可以得到兩層樹。在我的樹上,可能會有很多關卡。感謝您的回覆 –

相關問題