1

DB MetersTree TABLE

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とその関係を記述すると、タイトルで定義されているエラーが発生します。

4

2 に答える 2

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);
}
于 2012-12-13T16:13:34.133 に答える
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;
}

に興味のあるすべての人に感謝します...

于 2012-12-14T12:46:12.240 に答える