爱上MVC3系列~开发一个站点地图(俗称面包屑)

回到目录

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

运行效果如图

回到目录

你可能感兴趣的:(mvc)