asp.net mvc+EF 递归生成树结构返回json

时间:2023-11-26 15:58:50

0、数据表结构,主要属性有:Id、parentId(父节Id)、Text、Url……等等。

asp.net mvc+EF 递归生成树结构返回json

1、新建一个树结构MenuModels

    public class MenuModels
{
private int _id;
private string _text;
private int? _parentid;
private string _icon;
private string _url;
private object _menus;
private Dictionary<string, string> _attributes = new Dictionary<string, string>(); public int id
{
get { return _id; }
set { _id = value; }
}
public int? parentid
{
get { return _parentid; }
set { _parentid = value; }
}
public string text
{
get { return _text; }
set { _text = value; }
}
public string icon
{
get { return _icon; }
set { _icon = value; }
}
public string url
{
get { return _url; }
set { _url = value; }
}
public Dictionary<string, string> attributes
{
get { return _attributes; }
set { _attributes = value; }
}
public object menus
{
get { return _menus; }
set { _menus = value; }
}
}

2、在控制器中新建如下方法:

 /// <summary>
/// 加载树
/// </summary>
/// <returns></returns>
public JsonResult LoadTree()
{
List<MenuModels> list = InitTree();
return Json(list, "text/html", JsonRequestBehavior.AllowGet);
}
  /// <summary>
/// 初始化树 默认找出*菜单
/// </summary>
/// <returns></returns>
public List<MenuModels> InitTree()
{
var TreeList = _db.Cent_Tree.ToList();
List<MenuModels> rootNode = new List<MenuModels>();
foreach (var plist in TreeList.Where(t => t.ParentID == null))
{
MenuModels jt = new MenuModels();
jt.id = plist.ID;
jt.text = plist.Name;
jt.parentid = plist.ParentID;
jt.icon = "";
jt.url = plist.SystemUrl;
jt.attributes = CreateUrl(TreeList, jt);
jt.menus = CreateChildTree(TreeList, jt);
rootNode.Add(jt);
}
return rootNode;
}
/// <summary>
/// 递归生成子树
/// </summary>
/// <param name="TreeList"></param>
/// <param name="jt"></param>
/// <returns></returns>
private List<MenuModels> CreateChildTree(List<Cent_Tree> TreeList, MenuModels jt)
{
int keyid = jt.id;//根节点ID
List<MenuModels> nodeList = new List<MenuModels>();
var children = TreeList.Where(t => t.ParentID == keyid);
foreach (var chl in children)
{
MenuModels node = new MenuModels();
node.id = chl.ID;
node.text = chl.Name;
node.parentid = chl.ParentID;
node.icon = "";
node.url = chl.SystemUrl;
node.attributes = CreateUrl(TreeList, node);
node.menus = CreateChildTree(TreeList, node);
nodeList.Add(node);
}
return nodeList;
}
/// <summary>
/// 把Url属性添加到attribute中,如果需要别的属性,也可以在这里添加
/// </summary>
/// <param name="TreeList"></param>
/// <param name="jt"></param>
/// <returns></returns>
private Dictionary<string, string> CreateUrl(List<Cent_Tree> TreeList, MenuModels jt)
{
Dictionary<string, string> dic = new Dictionary<string, string>();
int keyid = jt.id;
var urlList = TreeList.Where(t => t.ID == keyid).SingleOrDefault();
string Sysurl = urlList.SystemUrl;
string Indexurl = urlList.IndexUrl;
dic.Add("sysurl", Sysurl);
dic.Add("indurl", Indexurl);
dic.Add("close", "true");
return dic;
}

3、运行,http://localhost/Home/loadtree