ASP.NET基于XML導航欄的制作
首先說明,本文為照顧剛?cè)腴T的新手,有些地方可能會稍微說點基礎的東西,高手可以直接忽略。
場景:以前做網(wǎng)站的時候,導航欄的鏈接都是寫死在頁面中的,這樣不易與維護。于是今天寫成了用XML配置的導航欄。用到了LINQ to XML。
先介紹一下功能:
儲存導航欄信息的XML文件如下:
- <?xml version="1.0" encoding="utf-8" ?>
- <NavigationMenu>
- <MenuItem Title="Shit" Link="/Fuck" OrderId ="2" Enabled="True" />
- <MenuItem Title="Shitter" Link="/Fucker" OrderId ="1" Enabled="True" />
- <MenuItem Title="Shitting" Link="/Fucking" OrderId ="3" Enabled="True" />
- <MenuItem Title="Shitful" Link="/Fucked" OrderId ="4" Enabled="False" />
- <MenuItem Title="Shitfully" Link="/Fuckly" OrderId ="5" Enabled="True" />
- </NavigationMenu>
Title是顯示名稱,Link是URL,OrderId表示排序的序位,Enabled為是否啟用。這個菜單將最終被解析為一個ul列表:
- <ul>
- <li><a href="/Fucker">Shitter</a></li>
- <li><a href="/Fuck">Shit</a></li>
- <li><a href="/Fucking">Shitting</a></li>
- <li><a href="/Fuckly">Shitfully</a></li>
- </ul>
然后我們來看看如何實現(xiàn):
首先需要給菜單創(chuàng)建一個只包含屬性的模型類,它的作用是成為對具體某一個菜單項的描述,系統(tǒng)中傳遞的將是這樣一個模型:
- public class MenuItem
- {
- public string Title { get; set; }
- public string Link { get; set; }
- public int OrderId { get; set; }
- public bool Enabled { get; set; }
- }
接下來我們要寫一個從XML讀取所有菜單項,并返回List<MenuItem>泛型集合的方法。在這個例子里,List<MenuItem>里放的是所有5個MenuItem對象。
- private List<MenuItem> GetList()
- {
- var menuPath = Server.MapPath(@"~\App_Data\Menu.xml");
- if (System.IO.File.Exists(menuPath))
- {
- XElement root = XElement.Load(menuPath);
- var menuItems = from el in root.Elements("MenuItem")
- select new MenuItem()
- {
- Title = el.Attribute("Title").Value,
- Link = el.Attribute("Link").Value,
- OrderId = int.Parse(el.Attribute("OrderId").Value),
- Enabled = bool.Parse(el.Attribute("Enabled").Value)
- };
- return menuItems.ToList();
- }
- else
- {
- //throw new System.IO.FileNotFoundException();
- return null;
- }
- }
這個方法里我用了LINQ to XML,這是現(xiàn)在.NET操作XML最方便的辦法。但LINQ要求你的Framework版本至少是3.5。在這個方法中,我們首先加載了 Menu.xml文件,然后查找所有MenuItem節(jié)點,并把這些節(jié)點的屬性賦值給new出來的MenuItem對象。創(chuàng)建MenuItem對象的時 候,我使用的語法叫做對象初始化器。在return語句中,我寫了ToList(),這樣可以確保返回值是List<MenuItem>類 型。
值得注意的是,我并沒有把判斷Enabled和對OrderId排序的邏輯寫在這個方法中。因為判斷是否啟用和排序這兩個操作屬于業(yè)務邏輯,與數(shù)據(jù) 讀取無關,所以我們分離了關注點,GetList()是趨于穩(wěn)定的方法,任何業(yè)務需求的改變都不需要修改這個方法,因為它的目的很簡單——僅僅是讀取數(shù) 據(jù)。一個方法只做一件事情,這是一個原則。
接下來我們還需要寫一個業(yè)務方法,從GetList()的菜單項中選擇所有Enabled的菜單,并按OrderId升序排列:
- private void FetchMenuData()
- {
- var menuList = GetList();
- if (null != menuList && menuList.Count > 0)
- {
- // 查找所有已啟用的菜單,并按OrderId升序排列
- var menuView = (from item in menuList
- where item.Enabled
- orderby item.OrderId ascending
- select item).ToList();
- rptMenu.DataSource = menuView;
- rptMenu.DataBind();
- }
- }
為了偷懶,我直接把查詢結(jié)果綁給了Repeater控件。如果按照三層的思想,我不可以把顯示這塊寫在這個業(yè)務方法里。本文不探討分層,有興趣的朋友可以看看《ASP.NET設計模式》這本書。
接下來,我們只要在頁面上放一個Repeater控件,并在Page_Load的時候調(diào)用FetchMenuData()就完成了:
- <ul>
- <asp:Repeater ID="rptMenu" runat="server">
- <ItemTemplate>
- <li><a href="<%#Eval("Link")%>"><%#Eval("Title")%></a></li>
- </ItemTemplate>
- </asp:Repeater>
- </ul>
- protected void Page_Load(object sender, EventArgs e)
- {
- if (!Page.IsPostBack)
- {
- FetchMenuData();
- }
- }
有圖有真相:
DEMO下載和原文在 http://www.wyjexplorer.cn/Home/View/B1A9770CEC6D0C4C.html
原文鏈接:http://www.cnblogs.com/wyjexplorer/archive/2012/04/27/2473537.html


2009-07-27 14:46:16
2009-07-27 03:21:00
2009-09-04 13:11:25
2009-07-22 17:45:35
2009-08-10 17:50:05




