原來早在webform控件時代就有了SiteMap這個東西,而進行MVC時代后,我們也希望有這樣一個東西,它為我們提供了不少方便,如很方便的實現頁面導航的內容修改,頁面導航的樣式換膚等.
我的MvcSiteMap主要由實體文件,XML配置文件,C#調用文件組成,當然為了前台使用方便,可以為HtmlHelper添加一個擴展方法.
實體部分
/// <summary> /// mvc站點地圖(面包屑) /// </summary> public class MvcSiteMap { [XmlAttribute] public int ID { get; set; } [XmlAttribute] public string Title { get; set; } [XmlAttribute] public string Url { get; set; } [XmlAttribute] public int ParnetID { get; set; } public MvcSiteMap Parent { get; set; } } public class MvcSiteMapList : IConfiger { public List<MvcSiteMap> MvcSiteMaps { get; set; } }
XML部分代碼
<?xml version="1.0" encoding="utf-8"?> <MvcSiteMapList> <MvcSiteMaps> <MvcSiteMap Title = "根" Url = "#" ID = "1" ParnetID = "0"></MvcSiteMap> <MvcSiteMap Title = "測試網站" Url = "#" ID = "2" ParnetID = "1"></MvcSiteMap> <MvcSiteMap Title = "首頁123sadfasdfds" Url = "/" ID = "3" ParnetID = "2"></MvcSiteMap> </MvcSiteMaps> </MvcSiteMapList>
C#核心代碼
/// <summary> /// 站點地圖工廠 /// </summary> public class MvcSiteMapFactory { private static List<MvcSiteMap> siteMapList { get { if (string.IsNullOrWhiteSpace(SiteMapString)) throw new ArgumentException("請為在web.config中配置SiteMapString節點,以支持網站地圖功能"); return ConfigCache.ConfigFactory.Instance.GetConfig<MvcSiteMapList>(System.Web.HttpContext.Current.Server.MapPath(SiteMapString)).MvcSiteMaps; } } private static string SiteMapString = System.Configuration.ConfigurationManager.AppSettings["SiteMapString"] ?? string.Empty; /// <summary> /// 生成站點地圖 /// </summary> /// <param name="url"></param> /// <returns></returns> public static MvcHtmlString GeneratorSiteMap(string url) { StringBuilder str = new StringBuilder(); List<string> pathList = new List<string>(); MvcSiteMap current = GetSiteMap(url); GetFather(current, pathList); pathList.Reverse(); pathList.ForEach(i => { str.AppendFormat("<span style='padding:0 5px;'>{0}</span>>", i); }); string result = str.ToString(); if (!string.IsNullOrWhiteSpace(result)) result = result.Remove(str.ToString().Length - 1); return MvcHtmlString.Create(result); } static MvcSiteMap GetSiteMap(string url) { return siteMapList.FirstOrDefault(i => i.Url == url); } /// <summary> /// 遞歸找老祖宗 /// </summary> /// <param name="father"></param> static void GetFather(MvcSiteMap father, List<string> pathList) { if (father != null) { pathList.Add(string.Format("<a href={0}>{1}</a>", father.Url, father.Title)); father.Parent = siteMapList.FirstOrDefault(i => i.ID == father.ParnetID); GetFather(father.Parent, pathList); } } }
添加一個擴展方法
/// <summary> /// 站點地圖擴展 /// </summary> public static class MvcSiteMapExtensions { public static MvcHtmlString GeneratorSiteMap(this HtmlHelper html, string url) { return MvcSiteMapFactory.GeneratorSiteMap(url); } }
前台布局頁里調用
<div class="sitemap"> @Html.GeneratorSiteMap(Request.Url.AbsolutePath) </div>