java递归实现多级菜单栏_运用递归生成多级菜单栏

本文介绍如何利用Java递归从数据库读取数据,动态生成多级菜单栏。通过 MVC 结构,从数据库获取菜单数据并存入 Session,然后在视图中使用递归方法 `Sys_Menu2` 渲染菜单。这种方法使得菜单更新只需改动数据库,提高了灵活性。
摘要由CSDN通过智能技术生成

1:还是先上图 (出于保密原因,这里数据需要涂鸦,请谅解)

fb5d76d75dcd41d3eeec26f3e273b90b.png

可以看到 红箭头所指的进度条显示的是菜单栏竖向的进度,本例中我所有的子菜单一共有300多个 但是大的分类只有6个

bbb9d39f50ba486cc9fb36c4e1a97308.png 那我们开发的时候是不是要一个个在前端写好呢?这未免太恐怖也太可怕,加入我们的菜单要添加一个呢 换起来也麻烦。

所以正确的做法是菜单从数据库中读取。

2:下面就来展示下数据库的结构 这里我只要显示3个字段

9d1587ae926d6e81679628fffaa38274.png id(当前菜单的id 是newid())、pid(当前菜单的父级id)、name(当前菜单的内容)

在mvc中我微菜单生成专门写了个方法

6914d90d16567532686bbddd01c44d9f.png

在这个方法里从数据库中查询出符合条件的菜单集合

aa0220ba73148549882bd6315d03ea2f.png

方法体 如下

public ActionResult Navigator2()

{

CheckAuth();

try

{

if (m_user == null)

{

throw new Exception();

}

IList

if (Session["Navigator2"] != null)  //将菜单存到session中

{

li2 = Session["Navigator2"] as IList

}

else

{

string strSql = @" sql 根据自己情况去定";

DBHelper db = new DBHelper(Constant.db);

DataTable dt = db.GetDataSet(strSql);

if (dt != null && dt.Rows.Count > 0)

{

li2 = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(dt));

Session["Navigator2"] = li2;

}

}

ViewBag.data = li2;

}

catch (Exception ex)

{

ViewBag.data = null;

}

ViewBag.tage = 2;

return View("~/Views/Shared/Navigator2.cshtml");

}

navigator中 有如下代码

@{ if (ViewBag.tage == 1)//以为我还有个 Navigator方法 这里用的是 Navigator2 是下面 ViewBag.tage == 2 的方法体

{

@Navigator2.Sys_Menu(ViewBag.data, null, 0);

}

if (ViewBag.tage == 2)

{

@Navigator2.Sys_Menu2(ViewBag.data, "0d7e7ece-8b18-4d63-876b-edad20d29ca2", 0);

}

}

在appcode文件夹中有个

6032afe4bcfa7d3f3ec1b77e6af58afb.png Navigator2

里面递归调用方法体如下

@using app.DA.ef

@helper Sys_Menu2(IEnumerable entities, string pid, int? Plv)

{

string cls = "";

string Liclass = "";

string iclass = "";

//@Navigator2.Sys_Menu(@ViewBag.data, null,0)第一次调用是传递的pid是null 这里调用给出一级菜单的id作为二级菜单的父id

//筛选出一级菜单 entity是所有一级菜单的实体

//将所有的数据集合entities传递过去由entity.id作为条件筛选 会筛选出所有符合要求的下一级菜单所需要的集合 这里不要传递第一个参数不要传递entity 否则共筛选的数据源会越来越小 不符合要求

//第三个参数传递0表示是第一级菜单,下面会有判断if(Plv > 0) 代表是子节点 去找根,否则父空 为根节点 再具体渲染ul li

if (entities != null)//实体不为空开始循环

{

if (Plv == 0)

{

cls = "main-menu";

Liclass = "active opened active";

iclass = "linecons-cog";

}

if (Plv == 1)

{

cls = "";

Liclass = "";

iclass = "entypo-flow-line";

}

if (Plv == 2)

{

cls = "";

Liclass = "";

iclass = "entypo-flow-parallel";

}

if (Plv == 3)

{

cls = "";

Liclass = "";

iclass = "entypo-flow-cascade";

}

if (Plv == 4)

{

cls = "";

Liclass = "";

iclass = "entypo-flow-branch";

}

//var entity = entities.Where(o => o.lvl == 3);

IEnumerable menu;

menu = entities.Where(o => o._parentId == pid);

Plv++;

if (menu.Count() > 0)//判断是否有孩子节点 有则继续进行递归 没有不作任何处理

{

//渲染孩子

@foreach (var item in menu)//根据id寻找子节点

{

@item.name

@Sys_Menu2(entities, item.id, Plv) @*这里将item.id作为筛选条件*@

}

}

}

}

在页面加载时请求运行此方法之后 就会展示菜单,如果有新添加的菜单只需要在数据库中添加即可,退出清除session知乎再刷新就能看到最新的效果

主题思想就是菜单表里面各级菜单用 id  和pid联系起来 父级菜单的id为自己菜单的pid。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值