C#递归读取XML菜单数据的方法
本篇章节讲解C#递归读取XML菜单数据的方法。分享给大家供大家参考。具体分析如下: 最近在研究一些关于C#的一些技术,纵观之前的开发项目的经验,做系统时显示系统菜单的功能总是喜欢把数据写在数据库表,然后直接读取加载到菜单树上显示。 现在想把菜单数据都放在XML里,然后递归读取XML。 由于项目使用WCF,实体类使用了两个,一个是业务逻辑层中的实体,一个是调用业务逻辑层递归方法后进行数据实体的转换,XML读取方法写在业务逻辑层中。 思路: 1.先读取XML里所有的菜单 2.根据用户的权限显示所属用户的菜单加载到页面上 XML数据如下: 复制代码 代码如下: <?xml version="1.0" encoding="utf-8"?> <ZCSoft.Net xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <Applications> <Application ID ="OA" Text="OA管理系统"> <Modules> <Module ID="OA_System" Text="系统管理"> <Menus> <Menu ID="OA_System_UserManager" Text="人员管理" URL="System/UserManager/UserManagerList.aspx"> </Menu> <Menu ID="OA_System_RoleManager" Text="角色管理" URL="System/RoleManager/RoleManagerList.aspx"></Menu> <Menu ID="OA_System_LoginLog" Text="登录日志" URL="System/Log/LoginLogList.aspx"></Menu> <Menu ID="OA_System_OperateLog" Text="操作日志" URL="System/Log/OperateLogList.aspx"></Menu> </Menus> </Module> <Module ID="OA_TargetManage" Text="目标管理"> 菜单的业务逻辑实体类: 复制代码 代码如下: public class MenuTreeSearchModel { //菜单ID public string ItemCode { get; set; } //菜单名称 //菜单显示类型 //排序 //是否显示 //菜单链接 //上级ID //系统平台ID //系统平台名称 //模块ID //模块名称 递归方法,读取每个模块和模块下的菜单: 复制代码 代码如下: protected void GetChildMenuList(XElement root,List<MenuTreeSearchModel> menuTreeList) { var firstNode = root.FirstNode as XElement;//读取root节点内的第一个节点 if (null != firstNode) { //读取root节点下面同级的所有节点 var appList = from ele in root.Element(firstNode.Name.LocalName).Elements() select ele; bool thisVisible = true;//默认节点是可见的 foreach (var application in appList) if (application.Name.LocalName == "Application") if (application.Name.LocalName == "Module") if (thisVisible) //如果该模块的所属平台中的Display属性设置为可见true(注意:没有设置则默认为可见),则模块的上级为Application的ID if (application.Name.LocalName == "Menu") if (thisVisible) //如果该菜单的所属模块中的Display属性设置为可见true(注意:没有设置则默认为可见),则菜单的上级为Module的ID MenuTreeSearchModel model = new MenuTreeSearchModel(); if (null != nextNode)//如果还有下级节点 从XML文档读取: 复制代码 代码如下: /// <summary> /// 从XML文件读取菜单节点 /// </summary> /// <returns></returns> public List<MenuTreeSearchModel> GetMenuTreeByReadXML() { List<MenuTreeSearchModel> list = new List<MenuTreeSearchModel>(); //读取XML文档路径,这里我把XML放在网站的bin目录里 string xmlPath = AppDomain.CurrentDomain.BaseDirectory + "Foundation.xml"; XElement root = XElement.Load(xmlPath); var appList = from ele in root.Element("Applications").Elements() select ele; //按系统平台筛选 foreach (var application in appList) { MenuTreeSearchModel model = new MenuTreeSearchModel(); model.ItemCode = application.Attribute("ID").Value; model.ItemName = application.Attribute("Text").Value; model.ItemType = "Folder"; model.ItemOrder = 0; model.Visible = true; model.ItemUrl = null; model.ParentItem = null; model.ApplicationCode = application.Attribute("ID").Value; model.ApplicationName = application.Attribute("Text").Value; model.ModuleCode = null; model.ModuleName = null; list.Add(model); //递归调用 return list; 以下是在调用服务契约方法时进行的实体类: 复制代码 代码如下: public class PublicUserMenuTreeData { //菜单ID public string ItemCode { get; set; } //菜单名称 //菜单显示类型 //排序 //是否显示 //菜单链接 //上级ID //系统平台ID //系统平台名称 //模块ID //模块名称 实体转换方法: 复制代码 代码如下: public PublicUserMenuTreeData TransferUserMenuTreeToPublicUserMenu(MenuTreeData userMenuTreeData) { PublicUserMenuTreeData pubUserMenuTreeData = new PublicUserMenuTreeData(); pubUserMenuTreeData.ItemCode = userMenuTreeData.ItemCode; pubUserMenuTreeData.ItemName = userMenuTreeData.ItemName; pubUserMenuTreeData.ItemType = userMenuTreeData.ItemType; pubUserMenuTreeData.ItemOrder = userMenuTreeData.ItemOrder; pubUserMenuTreeData.Visible = userMenuTreeData.Visible; pubUserMenuTreeData.ItemUrl = userMenuTreeData.ItemUrl; pubUserMenuTreeData.ParentItem = userMenuTreeData.ParentItem; pubUserMenuTreeData.ApplicationCode = userMenuTreeData.ApplicationCode; pubUserMenuTreeData.ApplicationName = userMenuTreeData.ApplicationName; pubUserMenuTreeData.ModuleCode = userMenuTreeData.ModuleCode; pubUserMenuTreeData.ModuleName = userMenuTreeData.ModuleName; return pubUserMenuTreeData; } 用户权限菜单方法: 复制代码 代码如下: /// <summary> /// 有用户权限树获取共用的用户菜单列表 /// </summary> /// <param name="listAllUserMenu"></param> /// <returns></returns> public List<PublicUserMenuTreeData> GetPublicUserMenuFromUserMenuTreeData(List<MenuTreeData> listAllUserMenu) { List<PublicUserMenuTreeData> listPublicUserMenuTreeData = new List<PublicUserMenuTreeData>(); List<MenuTreeData> list = listAllUserMenu.FindAll(d => string.IsNullOrEmpty(d.ParentItem)).ToList(); foreach (var userMenuTreeData in list) { PublicUserMenuTreeData pubUserMenuTreeData = TransferUserMenuTreeToPublicUserMenu(userMenuTreeData); pubUserMenuTreeData.UserMenuTreeDatas = GetChildData(pubUserMenuTreeData.ItemCode,listAllUserMenu); listPublicUserMenuTreeData.Add(pubUserMenuTreeData); } return listPublicUserMenuTreeData; } public List<PublicUserMenuTreeData> GetChildData(string parentId,List<MenuTreeData> listUserMenuTreeData) { List<MenuTreeData> list = listUserMenuTreeData.FindAll(d => d.ParentItem == parentId).ToList(); 系统菜单类: 复制代码 代码如下: /// <summary> /// 系统菜单 /// </summary> [DataContract()] public class MenuTreeData { [DataMember()] [DataMember()] [DataMember()] [DataMember()] [DataMember()] [DataMember()] [DataMember()] [DataMember()] [DataMember()] [DataMember()] [DataMember()] } 后台页面加载Load代码: 复制代码 代码如下: string menuData = string.Empty; var treeList= GetMenuTreeList(); if (treeList!= null) { List<MenuTreeData> listAllUserMenu = treeList.FindAll(d => d.Visible).OrderBy(d => d.ItemOrder).ToList(); List<PublicUserMenuTreeData> listPublicUserMenuTreeData = GetPublicUserMenuFromUserMenuTreeData(listAllUserMenu); menuData = JsonConvert.SerializeObject(listPublicUserMenuTreeData); } 页面加载脚本,这里使用Jquery: 复制代码 代码如下: var obj = menuData; GetMenuInfo(obj); function GetMenuInfo(obj) { var str = ""; var objInfo = ""; if (obj) { objInfo = obj.split("|"); if (objInfo[0] != "") { var PublicUserMenuTreeData = JSON.parse(objInfo[0]); for (var i = 0; i < PublicUserMenuTreeData.length; i++) { str += ("<li>"); var tempmenu= PublicUserMenuTreeData[i]; if (tempmenu.ItemType && tempmenu.ItemType == "Menu") { str += ("<a href='#' onclick='" + tempmenu.ItemCode + "()' id='" + tempmenu.ItemCode + "'>" + tempmenu.ItemName + "</a>"); str += ("<script> function " + tempmenu.ItemCode); str += ("() { tabframe1.newTab({ title: '" + tempmenu.ItemName + "',"); if (tempmenu.ItemUrl.indexOf('?') != -1) { str += ("src: '" + tempmenu.ItemUrl + "&applicationid=" + tempmenu.ApplicationCode + "&moduleid=" + tempmenu.ModuleCode + "',"); } else { str += ("src: '" + tempmenu.ItemUrl + "?applicationid=" + tempmenu.ApplicationCode + "&moduleid=" + tempmenu.ModuleCode + "',"); } str += (" id: 'oa-system-" + tempmenu.ItemCode + "',"); if (PublicUserMenuTreeData[i].UserMenuTreeDatas) { function GetRecurrenceData(listPublicUserMenuTreeData) { str += (" id: 'oa-system-" + listPublicUserMenuTreeData[j].ItemCode + "',");
str += ("</li>"); 效果图: 这里补充一下:菜单中如果在模块Module里设置属性Display="false",则模块不显示出来,可是模块下的菜单可显示出来。 itemType="Folder"显示类型是目录,itemType="Menu"显示类型是菜单 希望本文所述对大家的C#程序设计有所帮助。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |