在博客園注冊了有4年了,很遺憾至今仍未發表過博客,趁周末有空發表第一篇博客。小生不才,在此獻丑了!
最近在研究一些關于C#的一些技術,縱觀之前的開發項目的經驗,做系統時顯示系統菜單的功能總是喜歡把數據寫在數據庫表,然后直接讀取加載到菜單樹上顯示。
現在想把菜單數據都放在XML里,然后遞歸讀取XML。
由于項目使用WCF,實體類使用了兩個,一個是業務邏輯層中的實體,一個是調用業務邏輯層遞歸方法后進行數據實體的轉換,XML讀取方法寫在業務邏輯層中。
思路:1.先讀取XML里所有的菜單2.根據用戶的權限顯示所屬用戶的菜單加載到頁面上
XML數據如下:

1 <?xml version="1.0" encoding="utf-8"?> 2 <ZCSoft.Net xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 3 <applications> 4 <Application ID ="OA" Text="OA管理系統"> 5 <Modules> 6 <Module ID="OA_System" Text="系統管理"> 7 <Menus> 8 <Menu ID="OA_System_UserManager" Text="人員管理" URL="System/UserManager/UserManagerList.aspx"> </Menu> 9 <Menu ID="OA_System_RoleManager" Text="角色管理" URL="System/RoleManager/RoleManagerList.aspx"></Menu>10 <Menu ID="OA_System_LoginLog" Text="登錄日志" URL="System/Log/LoginLogList.aspx"></Menu>11 <Menu ID="OA_System_OperateLog" Text="操作日志" URL="System/Log/OperateLogList.aspx"></Menu>12 </Menus>13 </Module>14 15 <Module ID="OA_TargetManage" Text="目標管理">16 <Menus>17 <Menu ID="OA_TargetManage_TargetSetup" Text="目標設定" URL="OA/TargetManage/TargetSetupList.aspx">18 </Menu>19 </Menus>20 </Module>21 </Modules>22 </Application>23 </ZCSoft.Net>View Code
菜單的業務邏輯實體類:

1 public class MenuTreeSearchModel 2 { 3 //菜單ID 4 public string ItemCode { get; set; } 5 6 //菜單名稱 7 public string ItemName { get; set; } 8 9 //菜單顯示類型10 public string ItemType { get; set; }11 12 //排序13 public int ItemOrder { get; set; }14 15 //是否顯示16 public bool Visible { get; set; }17 18 //菜單鏈接19 public string ItemUrl { get; set; }20 21 //上級ID22 public string ParentItem { get; set; }23 24 //系統平臺ID25 public string ApplicationCode { get; set; }26 27 //系統平臺名稱28 public string ApplicationName { get; set; }29 30 //模塊ID31 public string ModuleCode { get; set; }32 33 //模塊名稱34 public string ModuleName { get; set; }35 }View Code遞歸方法,讀取每個模塊和模塊下的菜單:

1 PRotected void GetChildMenuList(XElement root, List<MenuTreeSearchModel> menuTreeList) 2 { 3 var firstNode = root.FirstNode as XElement;//讀取root節點內的第一個節點 4 if (null != firstNode) 5 { 6 //讀取root節點下面同級的所有節點 7 var appList = 8 from ele in root.Element(firstNode.Name.LocalName).Elements() 9 select ele;10 11 bool thisVisible = true;//默認節點是可見的12 XAttribute thisAttr = root.Attribute("Display");13 if (null != thisAttr)//如果菜單的上級模塊有顯示屬性14 {15 string thisDisplay = thisAttr.Value;16 thisVisible = thisDisplay.ToLower() == "false" ? false : true;17 }18 19 foreach (var application in appList)20 {21 //模塊Display屬性22 XAttribute modAttr = application.Attribute("Display");23 bool visible = true;24 if (null != modAttr)25 {26 string display = application.Attribute("Display").Value;27 visible = display.ToLower() == "false" ? false : true;28 }29 var nextNode = application.FirstNode as XElement;//該節點的下級節點30 31 string itemType = "Folder";//目錄還是菜單32 string itemUrl = null;//鏈接地址33 string parentItem = null;//上一節點ID34 string applicationCode = null;//平臺編碼35 string applicationName = null;//平臺名稱36 string moduleCode = null;//模塊編碼37 string moduleName = null;//模塊名稱38 39 if (application.Name.LocalName == "Application")40 {41 applicationCode = application.Attribute("ID").Value;42 applicationName = application.Attribute("Text").Value;43 }44 45 if (application.Name.LocalName == "Module")46 {47 moduleCode = application.Attribute("ID").Value;48 moduleName = application.Attribute("Text").Value;49 applicationCode = root.Attribute("ID").Value;50 applicationName = root.Attribute("Text").Value;51 52 if (thisVisible) //如果該模塊的所屬平臺中的Display屬性設置為可見true(注意:沒有設置則默認為可見),則模塊的上級為Application的ID53 {54 parentItem = root.Attribute("ID").Value;55 }56 }57 58 if (application.Name.LocalName == "Menu")59 {60 itemType = "Menu";61 itemUrl = application.Attribute("URL").Value;62 moduleCode = root.Attribute("ID").Value;63 moduleName = root.Attribute("Text").Value;64 applicationCode = root.Parent.Parent.Attribute("ID").Value;65 applicationName = root.Parent.Parent.Attribute("Text").Value;66 67 if (thisVisible) //如果該菜單的所屬模塊中的Display屬性設置為可見true(注意:沒有設置則默認為可見),則菜單的上級為Module的ID68 {69 parentItem = root.Attribute("ID").Value;70 }71 else//如果該菜單的所屬模塊中的Display屬性設置為不可見false,則菜單的上級為Application的ID72 {73 parentItem = root.Parent.Parent.Attribute("ID").Value;74 }75 }76 77 MenuTreeSearchModel model = new MenuTreeSearchModel();78 model.ItemCode = application.Attribute("ID").Value;79 model.ItemName = application.Attribute("Text").Value;80 model.ItemType = itemType;81 model.ItemOrder = 0;82 model.Visible = visible;83 model.ItemUrl = itemUrl;84 model.ParentItem = parentItem;85 model.ApplicationCode = applicationCode;86 model.ApplicationName = applicationName;87 model.ModuleCode = moduleCod
新聞熱點
疑難解答