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

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

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

先介绍一下功能:

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

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

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

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

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

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

 
 
  1. publicclassMenuItem
  2. {
  3. publicstringTitle{get;set;}
  4. publicstringLink{get;set;}
  5. publicintOrderId{get;set;}
  6. publicboolEnabled{get;set;}
  7. }

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

 
  1. privateList<MenuItem>GetList()
  2. {
  3. varmenuPath=Server.MapPath(@"~\App_Data\Menu.xml");
  4. if(System.IO.File.Exists(menuPath))
  5. {
  6. XElementroot=XElement.Load(menuPath);
  7. varmenuItems=fromelinroot.Elements("MenuItem")
  8. selectnewMenuItem()
  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. returnmenuItems.ToList();
  16. }
  17. else
  18. {
  19. //thrownewSystem.IO.FileNotFoundException();
  20. returnnull;
  21. }
  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. privatevoidFetchMenuData()
  2. {
  3. varmenuList=GetList();
  4. if(null!=menuList&&menuList.Count>0)
  5. {
  6. //查找所有已启用的菜单,并按OrderId升序排列
  7. varmenuView=(fromiteminmenuList
  8. whereitem.Enabled
  9. orderbyitem.OrderIdascending
  10. selectitem).ToList();
  11. rptMenu.DataSource=menuView;
  12. rptMenu.DataBind();
  13. }
  14. }

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

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

 
  1. <ul>
  2. <asp:RepeaterID="rptMenu"runat="server">
  3. <ItemTemplate>
  4. <li><ahref="<%#Eval("Link")%>"><%#Eval("Title")%></a></li>
  5. </ItemTemplate>
  6. </asp:Repeater>
  7. </ul>
 
 
  1. protectedvoidPage_Load(objectsender,EventArgse)
  2. {
  3. if(!Page.IsPostBack)
  4. {
  5. FetchMenuData();
  6. }
  7. }

有图有真相:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值