ASP.NET基于XML导航栏的制作

Master页面,用XML动态创建左侧导航栏。 我在做的一个HR网站要求根据用户角色显示不同的菜单,经理有全部权限,可以编辑基础数据如部门职位,一般员工只可以浏览人员信息,修改自己的人员信息。另外,对人员的查询要求可以按照部门查询,而部门是可以动态的增减的。因此,要求根据部门表动态创建查询菜单。如下图  我没有采用aspnet2.0的导航控件,我在master页上加了一个xml control。在master的Page_Lo 阅读详情

首先说明,本文为照顾刚入门的新手,有些地方可能会稍微说点基础的东西,高手可以直接忽略。

场景:以前做网站的时候,导航栏的链接都是写死在页面中的,这样不易与维护。于是今天写成了用XML配置的导航栏。用到了LINQ to XML。

先介绍一下功能:

储存导航栏信息的XML文件如下:

  1. <?xml version="1.0" encoding="utf-8" ?> 
  2. <NavigationMenu> 
  3.     <MenuItem Title="Shit" Link="/Fuck" OrderId ="2" Enabled="True" /> 
  4.     <MenuItem Title="Shitter" Link="/Fucker" OrderId ="1" Enabled="True" /> 
  5.     <MenuItem Title="Shitting" Link="/Fucking" OrderId ="3" Enabled="True" /> 
  6.     <MenuItem Title="Shitful" Link="/Fucked" OrderId ="4" Enabled="False" /> 
  7.     <MenuItem Title="Shitfully" Link="/Fuckly" OrderId ="5" Enabled="True" /> 
  8. </NavigationMenu> 

Title是显示名称,Link是URL,OrderId表示排序的序位,Enabled为是否启用。这个菜单将最终被解析为一个ul列表:

  1. <ul> 
  2.     <li><a href="/Fucker">Shitter</a></li> 
  3.     <li><a href="/Fuck">Shit</a></li> 
  4.     <li><a href="/Fucking">Shitting</a></li> 
  5.     <li><a href="/Fuckly">Shitfully</a></li> 
  6. </ul> 

然后我们来看看如何实现:

首先需要给菜单创建一个只包含属性的模型类,它的作用是成为对具体某一个菜单项的描述,系统中传递的将是这样一个模型:

 
 
  1. public class MenuItem  
  2. {  
  3.     public string Title { get; set; }  
  4.     public string Link { get; set; }  
  5.     public int OrderId { get; set; }  
  6.     public bool Enabled { get; set; }  
  7. } 

接下来我们要写一个从XML读取所有菜单项,并返回List<MenuItem>泛型集合的方法。在这个例子里,List<MenuItem>里放的是所有5个MenuItem对象。

  1. private List<MenuItem> GetList()  
  2. {  
  3.     var menuPath = Server.MapPath(@"~\App_Data\Menu.xml");  
  4.     if (System.IO.File.Exists(menuPath))  
  5.     {  
  6.         XElement root = XElement.Load(menuPath);  
  7.         var menuItems = from el in root.Elements("MenuItem")  
  8.                         select new MenuItem()  
  9.                         {  
  10.                             Title = el.Attribute("Title").Value,  
  11.                             Link = el.Attribute("Link").Value,  
  12.                             OrderId = int.Parse(el.Attribute("OrderId").Value),  
  13.                             Enabled = bool.Parse(el.Attribute("Enabled").Value)  
  14.                         };  
  15.  
  16.         return menuItems.ToList();  
  17.     }  
  18.     else  
  19.     {  
  20.         //throw new System.IO.FileNotFoundException();  
  21.         return null;  
  22.     }  
  23. } 

这个方法里我用了LINQ to XML,这是现在.NET操作XML最方便的办法。但LINQ要求你的Framework版本至少是3.5。在这个方法中,我们首先加载了 Menu.xml文件,然后查找所有MenuItem节点,并把这些节点的属性赋值给new出来的MenuItem对象。创建MenuItem对象的时 候,我使用的语法叫做对象初始化器。在return语句中,我写了ToList(),这样可以确保返回值是List<MenuItem>类 型。 

值得注意的是,我并没有把判断Enabled和对OrderId排序的逻辑写在这个方法中。因为判断是否启用和排序这两个操作属于业务逻辑,与数据 读取无关,所以我们分离了关注点,GetList()是趋于稳定的方法,任何业务需求的改变都不需要修改这个方法,因为它的目的很简单——仅仅是读取数 据。一个方法只做一件事情,这是一个原则。

接下来我们还需要写一个业务方法,从GetList()的菜单项中选择所有Enabled的菜单,并按OrderId升序排列:

 
 
  1. private void FetchMenuData()  
  2. {  
  3.     var menuList = GetList();  
  4.     if (null != menuList && menuList.Count > 0)  
  5.     {  
  6.         // 查找所有已启用的菜单,并按OrderId升序排列  
  7.         var menuView = (from item in menuList  
  8.                         where item.Enabled  
  9.                         orderby item.OrderId ascending  
  10.                         select item).ToList();  
  11.  
  12.         rptMenu.DataSource = menuView;  
  13.         rptMenu.DataBind();  
  14.     }  
  15. } 

为了偷懒,我直接把查询结果绑给了Repeater控件。如果按照三层的思想,我不可以把显示这块写在这个业务方法里。本文不探讨分层,有兴趣的朋友可以看看《ASP.NET设计模式》这本书。

接下来,我们只要在页面上放一个Repeater控件,并在Page_Load的时候调用FetchMenuData()就完成了:

  1. <ul> 
  2.     <asp:Repeater ID="rptMenu" runat="server"> 
  3.         <ItemTemplate> 
  4.             <li><a href="<%#Eval("Link")%>"><%#Eval("Title")%></a></li> 
  5.         </ItemTemplate> 
  6.     </asp:Repeater> 
  7. </ul> 
 
 
  1. protected void Page_Load(object sender, EventArgs e)  
  2. {  
  3.     if (!Page.IsPostBack)  
  4.     {  
  5.         FetchMenuData();  
  6.     }  
  7. } 

有图有真相:

DEMO下载和原文在 http://www.wyjexplorer.cn/Home/View/B1A9770CEC6D0C4C.html

比较好看的导航菜单(ASP.NET) 一个不错的导航菜单,针对ASP.NET,使用了jQuery 立即下载

相关推荐

左侧树形菜单(xml)

html源码实现的左侧无限级左侧菜单,菜单名称等单独放在xml中

ASP.NET的面包屑导航控件、树形导航控件、菜单控件

ASP.NET的面包屑导航控件、树形导航控件、菜单控件。 1、 面包屑导航控件——SiteMapPath控件 SiteMapPath控件可以为站点提供“面包屑导航”的功能。 1.1 创建站点地图文件Web.sitemap 在ASP.NET中,有一个叫站点地图的XML文件。站点地图的文件名必须是Web.sitemap,而且需要放置于应用程序的根目录。 &lt;?xml version="...

pan_junbiao的博客 8591

树莓派介绍与可安装的操作系统

树莓派是一款由英国树莓派基金会开发的信用卡大小的微型计算机。处理器(CPU)内存(RAM)图形处理器(GPU)USB 接口网络接口(以太网和 Wi-Fi)视频输出(HDMI)音频输出用户只需添加电源、存储卡、显示器和输入设备(键盘、鼠标),就可以将其当作一台功能齐全的电脑使用。主要特点:低成本:价格亲民,适合教育和个人项目。小巧便携:体积小,便于携带和部署。功能强大:支持多种编程语言和操作系统,功能不逊于传统电脑。树莓派从最初的教育工具发展成为功能强大的多用途平台。最新的树莓派 5。

像风一样自由的博客 2196

ASP.NET CORE MVC动态生成左侧菜单栏

然后创建MenuViewModel类,这里写主要的业务逻辑,接收一个字符串参数controll,用于判断当前页面所在的是哪个控制器,由调用方传进来,这里的调用方是_Layout.cshtml。视图组件很强大,最适合用于菜单栏、动态导航栏等功能,当你在页面调用视图组件时,显示的数据取决于你传递的参数。而且MVC跳转页面时总是会刷新页面,导致当前选中的菜单栏高亮被取消,如何根据当前所在的页面高亮当前菜单栏?视图组件中的展示,因为我确定最多就一层子菜单,所以只嵌套了两层循环,如果有很多层子菜单就需要用递归了。..

撒野 4095

AnolisOS网卡驱动源码编译与安装实战指南

本文提供了一份详尽的AnolisOS网卡驱动源码编译与安装实战指南。针对系统自带通用驱动不兼容导致网络无法使用的问题,文章从环境准备、源码获取、编译安装到新旧驱动替换与持久化配置,一步步解析了如何通过源码编译安装官方驱动,解决硬件兼容性问题,并确保驱动在系统重启后自动生效。

weixin_28358083的博客 304

关于HC32F460 输出可调占空比PWM波遇到的问题记录

文章目录问题记录一、问题分析二、解决方法总结 问题记录 芯片:HC32F460系列 功能:PWM电机调速 最近产品开发,需要用到HC32的PWM输出来控制电机的转速。参考官方的例程很快就完成了相关的功能,但是,后面在测试,重复开关电机的时候,发现电机的转速时大时小。 一、问题分析 一开始,怀疑是相关寄存器的设置出错导致的问题。因此在设置PWM输出时加上LOG打印,上机测试并没有发现问题。 用示波器抓取波形,这是正常状态下的波形(上电默认配置成5kHz,70%占空比输出) 这是转速较小时的波形输出 .

Top0_0lll的博客 6165

ASP.NET学习——导航条设计方案

2.4 导航条设计方案一个Web站点,尤其是信息量大的大中型Web站点,应为用户提供站点导航。站点导航是每个网站必不可少的,它相当于城市公路的路标。通过导航条设计方案,可以使网站浏览者找到自己想要的内容。2.4.1 树型导航条设计方案树型导航条设计主要应用TreeView控件,TreeView控件对数据有着良好的支持,通过显示一个树状结构或菜单,让用户可以遍历访问站点中的不同页面。

yangxk666的专栏 5924

FPGA远程升级避坑实录:用STARTUPE2原语搞定Flash时钟,K7325T实测有效

本文深入解析了FPGA远程升级中的STARTUPE2原语应用,特别针对K7325T芯片的Flash时钟问题提供了实测有效的解决方案。通过详细的原语工作机制、Vivado工程实现步骤及调试技巧,帮助工程师规避常见陷阱,提升远程升级的可靠性和效率。

weixin_42558093的博客 141

【.NET全栈】ASP.NET开发Web应用——站点导航技术

大型的企业级网站,可能有成百上千个网页,导航变得十分重要。好的导航系统能够方便用户在多个页面间来回浏览,增加了应用程序的可交互性。ASP.NET提供了内置的导航技术,让开发人员创建站点导航变得轻松。ASP.NET中的站点地图用于导航的高级服务器控件TreeView菜单和导航服务器控件Menu站点地图是一个名为Web.sitemap的XML文件。

杰西笔记 1614

TI理想二极管在冗余电源中应用实例

深入探讨理想二极管如何提升冗余电源系统的效率与可靠性,通过实际应用案例展示其在电流隔离和自动切换中的优势,帮助工程师优化电源架构设计。

weixin_30653091的博客 987

CXL ALMP(ARB/MUX Link Management Packet)理解

ALMP(ARB/MUX Link Management Packet) 是CXL协议中由ARB/MUX层生成和处理的专用管理报文,用于协调链路电源状态切换(如L0s/L1)和虚拟链路状态机(vLSM)同步。ALMP是ARB/MUX层的控制平面报文,专用于以下场景:协调多协议(CXL.io、CXL.cachemem等)的链路状态切换(如L1进入/退出)。维护各协议独立的虚拟链路状态机(vLSM) 状态同步。在物理层(PHY)与链路层(Link Layer)之间仲裁电源管理请求。

Summer的博客 1198

ASP.NET Maker 2019破解版(ASP.NET代码生成工具)

点击下载来源:ASP.NET Maker 2019破解版(ASP.NET代码生成工具) ASP.NET Maker 2019是一款最新版本的ASP.NET代码生成工具,它具有组织和维护代码的过程,并从SQL服务器和其他数据库中以C语言快速生成ASP.NET Web应用程序,用户通过它还可以立即创建允许用户查看、编辑、搜索、添加和删除记录的网站。ASP.NET Maker的设计具有很高的灵活性,许多...

weixin_44130595的博客 1092

STM32学习笔记【江科协】【4-2】OLED显示屏

可以注意到接电源的GND和VCC同时和PB6、PB7号口连接,我们可以直接不初始化这两个引脚解决,因为STM32的引脚上电后,如果不初始化,默认是浮空输入的模式,在这个模式下,引脚不会输出电平,所以不会有什么影响,或者直接给PB6口输出低电平,PB7口输出高电平,用GPIO口直接给OLED供电,这个也是没问题的,因为OLED的功率很小这个也是可以驱动的,不过用GPIO口供电不是很规范,实际项目还是用电源供电。然后点击这里放大镜里面带d的图标,进入调试模式,这个界面里,

m0_74651303的博客 1595

学习019-01-01 Create a Predefined Dashboard and Add it to the Navigation(创建一个预定义仪表板并将其添加到导航栏)

本文介绍了如何创建预定义仪表板并添加到应用程序导航栏。首先在运行时创建仪表板并保存为XML文件(支持WinForms、ASP.NET Web Forms和ASP.NET Core Blazor三种方式),然后将XML文件作为资源添加到项目。通过在Updater.cs中调用DashboardsModule.AddDashboardData方法注册仪表板,再使用模型编辑器添加导航项并设置DashboardTitle属性。注意仪表板通过标题识别,添加后不可更改标题。最后可运行应用验证仪表板是否成功添加到导航,若仅

DevExpress Xaf 学习专栏 756

HQChart实战教程64-自定义分时图标题栏

分时图标题栏显示的是当前十字光标所在位置的分钟信息,显示在分时图窗口顶部。一般会显示品种的名称,日期,时间,价格,均价 涨幅,成交量,金额等等,hqchart内置会显示这些信息。如果要额外显示其他的字段,就需要通过替换格式化标题输出函数来是现实。我们在hqchart实例创建完成以后,通过OnCreatedCallback回调函数替换自己的格式化输出函数。返回 { AryText:[ { Text:文字, Color:颜色},…入参 data={ Data: 当前十字光标所在位置的分钟线 }

小银 1056

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

解读ASP.NET Portal Starter Kit(2)——用户配置文件篇

  ASP.NET Portal Starter Kit将网站所需的配置信息都存储在一个XML配置文件(PortalCfg.xml)中。这些配置信息控制门户内容的布局(如:显示哪些门户的标签,每个标签上显示哪些门户模块)以及安全设置(如:用户类别,访问权限等)。网络管理员通过修改配置文件就可以达到修改网站布局和调配各模块用户访问权限。将网站的配置信息存储在XML配置文件中而不存储在数据库中的好处有

WebPlat's Blog about SharePoint 1160

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

ASP.NET(C#)——Menu控件实现导航栏

一、打开aspx文件,从左边控件页面拖一个Menu控件和一个SiteMapDataSource控件。设置Menu属性DataSourceID="SiteMapDataSource1"设置SiteMapPath控件的User的SiteMapProvider为User。二、创建在/User文件夹下创建User.sitemap站点地图文件<?xml version="1.0" en...

weixin_30843605的博客 2588

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

用Asp.net制作顶部导航控件

一、效果简介  当点击一级栏目时(如首页),被点击的一级栏目的单元格背景色发生变色,如果该一级栏目下有二级栏目,则会在下一行显示出来,否则二级栏目这一行不会显示任何东西,但会占一定的高度。当点击二级栏目时,其所属的一级栏目单元格背景色发生变化,同时被点击的二级栏目名称会加粗,并在前方加一个“。”号,表示现在正在访问该栏目。当前位置会随着栏目的变化而变化。为了让该控件更灵活,我用了xml,这样就

jelink的专栏 1911

在ASP.NET 2.0中建立站点导航层次

站点导航提供程序--ASP.NET2.0中的站点导航提供程序暴露了应用程序中的页面的导航信息,它允许你单独地定义站点的结构,而不用考虑页面的实际物理布局。默认的站点导航提供程序是基于XML的,但是你也可以通过编写自定义的提供程序,从任何后端位置暴露这些信息。   站点导航API--站点导航API用于在应用程序的代码中访问站点导航信息,它摘录了导航信息存储的细节。你可以使用API来编程访...

aome1470的博客 221

TreeView控件数据绑定之:XML文件数据绑定

效果展示: XML文件: <?xml version="1.0" encoding="utf-8" ?> <root id="0" name="左侧导航栏"> <foods id="1" name="食物"> <foods id="11" name="生菜"></foods> <fo...

dfli35943397的博客 313

为ASP.NET Web API 创建帮助页面

为ASP.NET Web API 创建帮助页面 原文更新日期:2013.04.01 导航页面 http://blog.csdn.net/wf824284257/article/details/79475115 上一步 在WebForm项目中使用Web API http://blog.csdn.net/wf824284257/article/details/79449844 开...

wf824284257的博客 1187

用C#与XML创建动态分层菜单

                                       用C#与XML创建动态分层菜单    青苹果工作室编译 2001年04月02日 11:35  从在复杂的B2B交易中的交换数据到为应用程序提供配置文件结构,XML在许多方面大显身手!由于XML不断地获得软件的支持,我们完全能够预见:XML的应用将不断增加。本文就介绍这样一种应用程序,它使用XML创建类似于Windows开

iBreathe的专栏 1008

ASP.NET中树状目录和导航条的应用

小技巧:Ctrl+Table键,在Visual Stadio中进行两个页面之间的切换。 树状目录:TreeView A、重要属性:ShowLines、SelectionExpand(点节点的时候不刷新页面)、ExpandPath(路径)。 B、外观的设置属性:设置一系列的style,下面就来介绍介绍这些重要的样式style: 第一:RootNodeStyle根节点样式的设置。 第二:le

muximuxi_kgsecond的专栏 1713

C# 自定义数据类型 数组应用 读取XML

http://blog.csdn.net/leeguoquan/article/details/3864416 public struct MenuClass ////定义数据结构 { public string id; public string name; public string name_en; pu

菊花古剑和酒的专栏 1254
上一篇: ASP.NET中使用App_Code文件夹的异常
下一篇: 优快云小bug引发的思考,求赐教!
KimoGao
博客等级 码龄16年 180粉丝 82原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值