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

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

场景:以前做网站的时候,导航栏的链接都是写死在页面中的,这样不易与维护。于是今天写成了用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; }  

接下来我们要写一个从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.     }  

这个方法里我用了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.     }  

为了偷懒,我直接把查询结果绑给了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.     }  

有图有真相:

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

  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值