文章出處

返回目錄

今天寫緩存篇的第一篇文章,在寫完目錄后,得到了一些朋友的關注,這給我之后的寫作帶來了無窮的力量,在這里,感謝那幾位伙伴,哈哈!

書歸正傳,今天我帶來一個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方法提供的形式。

返回目錄


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()