文章出處
文章列表
今天寫緩存篇的第一篇文章,在寫完目錄后,得到了一些朋友的關注,這給我之后的寫作帶來了無窮的力量,在這里,感謝那幾位伙伴,哈哈!
書歸正傳,今天我帶來一個Static靜態成員的緩存,其實它也不是什么緩存,就是C#語言里的一個特性,靜態成員在被初始化后它將不會再被執行,即,他里面的內容只會被執行一次,直到你的網站被重啟后(只考慮在單線程情況下)。相信大家都在做網站時,遇到了網站導航面包屑功能點吧,一般,我們把它寫死在頁面上,這種作法沒有任何可擴展性和可維護性,所以,今天我們要改善一下這個功能點,使用的技術就是靜態成員緩存和樹型結構。
先看一下導航的結構
/// <summary> /// 導航面包 /// </summary> public class BannerBread { public string DisplayTitle { get; set; } public string Url { get; set; } public int ID { get; set; } public int ParentID { get; set; } public BannerBread Parent { get; set; } }
下面這段代碼就是實現導航的核心,它對外提供一個唯一的訪問點,所以,和兩個公開的方法,一個是GetBanner,用來返回當前URL對應的導航完整對象(包括祖宗對象),GenerateStandardBanner方法返回一個標準的導航,當前,具體的項目,你可以自己
去實現它。
/// <summary> /// 導航生產類 /// </summary> public static class BannerBreadFactory { /// <summary> /// BannerBread單例實例對象 /// </summary> static readonly List<BannerBread> Instance = new List<BannerBread>(); static BannerBreadFactory() { Instance.Add(new BannerBread { ID = 1, DisplayTitle = "首頁", Parent = null, ParentID = 0, Url = "/" }); Instance.Add(new BannerBread { ID = 2, DisplayTitle = "關于我們", Parent = null, ParentID = 1, Url = "/Home/About" }); Instance.Add(new BannerBread { ID = 3, DisplayTitle = "聯系我們", Parent = null, ParentID = 1, Url = "/Home/Contact" }); } /// <summary> /// 得到當前URL的祖宗節點 /// </summary> /// <param name="url"></param> /// <returns></returns> public static BannerBread GetBanner(string url) { var entity = Instance.FirstOrDefault(i => i.Url.ToUpper() == url.ToUpper()); GetFather(entity); return entity; } /// <summary> /// 標準的導航,程序開發人員可以根據自己的需要,在具體項目中去定義它 /// </summary> /// <param name="url"></param> /// <returns></returns> public static string GenerateStandardBanner(string url) { var entity = GetBanner(url); StringBuilder str = new StringBuilder(); while (entity != null) { str.Insert(0, "/<span><a href='" + entity.Url + "'>" + entity.DisplayTitle + "</a></span>"); entity = entity.Parent; } return str.ToString().StartsWith("/") ? str.ToString().Substring(1) : "未找到導航項"; } /// <summary> /// 得到祖宗 /// </summary> /// <param name="son"></param> private static void GetFather(BannerBread son) { if (son != null) { son.Parent = Instance.FirstOrDefault(i => i.ID == son.ParentID); GetFather(son.Parent); } } }
上面的代碼中,對于導航數據的部分,我選擇了靜態數據,當然,真實的項目中,需要將這塊放到數據庫里,以便于后期維護,一般地,我們可以在布局頁去調用它來實現導航顯示的功能,非常方便,下面是運行后的效果截圖
對于具體的顯示,我們的前臺顯示可以自己去組裝,上面顯示的只是一種標準的形式,即由GenerateStandardBanner方法提供的形式。
文章列表
全站熱搜