当前的应用设计风格趋于Flat扁平化,很多基于BootStrap实现了很多UI非常漂亮的管理界面(Bootstrap admin template)。

此核心文件开源在Github:https://github.com/JackWangCUMT/AdminLTE-Menu-Generate。首先看一下主界面:

查看左边导航的菜单html结构(下面代码有错误,HTML自定义属性直接用空格进行分割,而不是,号进行分割,不然jquery获取定义属性时可能会出现错误):

通过观察,可以发现其中菜单树的特点,这里注意一下,菜单顶级的标题显示在span中,另外class也不同。那边如何从数据库动态生成符合此特征的treemenu结构呢?

1 数据库字段设计

2 演示数据

5 菜单类实现:

首先树结构的菜单,自然想到用递归来构建(去掉html自定义属性的分割,号,用空格代替),代码如下:

  1. public class AdminLTEHelper
  2. {
  3. /// <summary>
  4. /// 根据DataTable生成AdminLTE的多级菜单目录
  5. /// GetTreeJsonByTable(datatable, "id", "title", "pid", "0","menulevel");
  6. /// </summary>
  7. /// <param name="tabel">数据源</param>
  8. /// <param name="idCol">ID列</param>
  9. /// <param name="txtCol">Text列</param>
  10. /// <param name="rela">关系字段(字典表中的树结构字段)</param>
  11. /// <param name="pId">父ID值(0)</param>
  12. /// <param name="colmenulevel">菜单显示层级列名</param>
  13. public StringBuilder result = new StringBuilder();
  14. public StringBuilder sb = new StringBuilder();
  15.  
  16. public void GetTreeJsonByTable(DataTable tabel, string idCol, string txtCol, string rela, object pId,string colmenulevel)
  17. {
  18.  
  19. result.Append(sb.ToString());
  20. sb.Clear();
  21.  
  22. if (tabel.Rows.Count > )
  23. {
  24.  
  25. string filer = string.Format("{0}='{1}'", rela, pId);
  26. DataRow[] rows = tabel.Select(filer);
  27. if (rows.Length > )
  28. {
  29. foreach (DataRow row in rows)
  30. {
  31. if (tabel.Select(string.Format("{0}='{1}'", rela, row[idCol])).Length > )
  32. {
  33. //第一层级,名称在<span>多级菜单</span>中 class为treeview
  34. //colmenulevel为menulevel,为菜单的显示层级,可以在后台进行配置
  35. //和树的层级可能不同
  36. if (row[colmenulevel].ToString() == "")
  37. {
  38. sb.Append("<li class=\"treeview\"><a href=\"#\"><i class=\"fa fa-folder\"></i><span>" + row[txtCol] + "</span><span class=\"pull-right-container\"> <i class=\"fa fa-angle-left pull-right\"></i></span></a>");
  39.  
  40. }
  41. else
  42. {
  43.  
  44. sb.Append("<li><a href=\"#\"><i class=\"fa fa-folder\"></i>" + row[txtCol] + "<span class=\"pull-right-container\"> <i class=\"fa fa-angle-left pull-right\"></i></span></a>");
  45.  
  46. }
  47. sb.Append("<ul class=\"treeview-menu\">");
  48. GetTreeJsonByTable(tabel, idCol, txtCol, rela, row[idCol], colmenulevel);
  49. sb.Append("</ul>");
  50. sb.Append("</li>");
  51. result.Append(sb.ToString());
  52. sb.Clear();
  53.  
  54. }
  55. else
  56. {
  57. //isleaf=true
  58. if (row[colmenulevel].ToString() == "")
  59. {
  60. //顶级菜单,标题显示在span中,否则显示图标时,标题不能隐藏
  61. sb.Append("<li class=\"treeview\"><a href=\"#\" moid=\"" + row[idCol] + "\",text=\"" + row[txtCol] + "\",isleaf=\"true\"" + ",url=\"" + row["url"] + "\"><i class=\"fa fa-folder\"></i><span>" + row[txtCol] + "</span></a></li>");
  62.  
  63. }
  64. else
  65. {
  66. sb.Append("<li><a href=\"#\" moid=\"" + row[idCol] + "\",text=\"" + row[txtCol] + "\",isleaf=\"true\"" + ",url=\"" + row["url"] + "\"><i class=\"fa fa-folder\"></i>" + row[txtCol] + "</a></li>");
  67. }
  68.  
  69. //sb.Append("<li><a href=\"#\" moid=\"" + row[idCol] + "\",text=\"" + row[txtCol] + "\",isleaf=\"true\"" + ",url=\"" + row["url"] + "\"><i class=\"fa fa-folder\"></i>" + row[txtCol] + "</a></li>");
  70.  
  71. result.Append(sb.ToString());
  72. sb.Clear();
  73. }
  74. result.Append(sb.ToString());
  75. sb.Clear();
  76.  
  77. }
  78.  
  79. }
  80.  
  81. result.Append(sb.ToString());
  82. sb.Clear();
  83.  
  84. }
  85.  
  86. }
  87. }

6 调用

7 测试

验证生成的菜单结构是否正确,首先看看显示的层级结构和数据库是否一致,另外查看单击上级,是否可以展开,最后注意的是,在左边菜单收缩后,只显示图标,鼠标移动到图标上后,并能正确显示子菜单:

8 应用

假设菜单是这样的:

用jquery可以在单击菜单某项时,打开页面

核心文件开源在Github:https://github.com/JackWangCUMT/AdminLTE-Menu-Generate

用C#从数据库动态生成AdminLTE菜单的一种方法的更多相关文章

  1. ABAP 动态生成内表的几种方法

    最近要写个程序,既有更新的,也有删除的,需要涉及到很多系统表,如果一个表一个表进行更新或者删除太慢了,于是就想通过创建动态内表来实现这些功能,在网上找了一些资料,经过多次尝试,终于测试成功了.网上讲述 ...

  2. tp根据数据库动态创建微信菜单

    喻可伟的博客   tp根据数据库动态创建微信菜单 $button = array();$class = M('ucenter_menu')->limit(3)->select();//取出 ...

  3. 应用rbac组件 动态生成一级菜单

    动态生成一级菜单 改表结构 需要知道是否是菜单\icon\名称权限表 +字段: is_menu = models.BooleanField(max_length=32,verbose_name='是否 ...

  4. JQuery实现动态生成树形菜单

    jQuery实现动态生成树形菜单 有一个需求:菜单导航条需要依据不同的权限动态提取出来.计划是将功能模块与用户权限之间的关系保持到一个配置表中.所以功能菜单的话就需要动态提取出来再显示.借助jquer ...

  5. jquery 根据后台传递过来的三维数组动态生成三级菜单

    根据后台传递过来的三维数组动态生成三级菜单 <!DOCTYPE html> <html lang="en"> <head> <meta c ...

  6. javascript生成新标签的三种方法

    javascript生成新标签的三种方法:http://www.cnblogs.com/online-link/p/6062423.html

  7. WPF编程,通过Double Animation动态旋转控件的一种方法。

    原文:WPF编程,通过Double Animation动态旋转控件的一种方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/art ...

  8. WPF编程,通过Double Animation动态缩放控件的一种方法。

    原文:WPF编程,通过Double Animation动态缩放控件的一种方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/art ...

  9. (一)JQuery动态加载js的三种方法

    Jquery动态加载js的三种方法如下: 第一种: $.getscript("test.js"); 例如: <script type="text/javascrip ...

随机推荐

  1. windows 2012 r2 can't find kb2919355

    问题   解决: 1.手动安装了 Windows8.1-KB2919442-x64 2.手动下载 KB2919355 更新成功     Turns out to have been a result ...

  2. Linux测试环境搭建的学习建议

    随着Linux应用的扩展许多朋友开始接触Linux,根据学习Windwos的经验往往有一些茫然的感觉:不知从何处开始学起.这里介绍学习Linux测试环境搭建的一些建议. 一.Linux测试环境搭建从基 ...

  3. 机器指令翻译成 JavaScript —— 终极目标

    上一篇,我们顺利将 6502 指令翻译成 C 代码,并演示了一个案例. 现在,我们来完成最后的目标 -- 转换成 JavaScript. 中间码输出 我们之所以选择 C,就是为了使用 LLVM.现在来 ...

  4. CentOS Mono Nginx 部署 MVC4+WebApi

    CentOS Mono Nginx 部署 MVC4+WebApi 经过几天的折磨,终于在CentOS上成功部署了MVC4+WebApi.Mono上的服务器推荐两种:Jexus(国产高人写的一款很牛的服 ...

  5. Xamarin.Android快速入门

    一.准备工作 1.创建一个空的解决方案,并命名为Phoneword 2.右击解决方案 新建->新建项目 并命名为Phoneword_Droid 二.界面 1.打开Resources文件夹-> ...

  6. 包含LOB_Data列的表删除大量数据后表及数据库文件的收缩

    最近有一张表(内含varchar(max)字段),占用空间达到240G,删除历史数据后几十万条后,空间并未得到释放. 然后用DBCC CLEANTABLE(0,tb_name,100)来释放删除记录后 ...

  7. C++ std::deque

    std::deque template < class T, class Alloc = allocator > class deque; Double ended queue deque ...

  8. Jquery

    使用时jquery先引进jquery文件包 <script src="jquery-1.11.2.min.js"></script> 一个页面有多个文件jq ...

  9. ★Kali信息收集~3.子域名系列

    ★3.1Netcraft :子域名查询  官网:http://searchdns.netcraft.com/ 输入要查询的域名,即可得知子域名 3.2Fierce :子域名查询 概述: fierce ...

  10. Eclipse中文语言包安装和设置中文Doc

    1.安装中文语言包 Eclipse所有的扩展功能都是以插件的形式添加上去的,安装插件时有多种形式,下面是比较常用的两种: 直接将插件中的文件复制到Eclipse对于的目录中.优点是安装时很方便,缺点是 ...