原来早在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>