回到目录

原来早在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 = "" ParnetID = ""></MvcSiteMap>
<MvcSiteMap Title = "测试网站" Url = "#" ID = "" ParnetID = ""></MvcSiteMap>
<MvcSiteMap Title = "首页123sadfasdfds" Url = "/" ID = "" ParnetID = ""></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 - ); 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>

运行效果如图

aaarticlea/png;base64,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" alt="" />

回到目录

爱上MVC3系列~开发一个站点地图(俗称面包屑)的更多相关文章

  1. WPF MVVM UI分离之《交互与数据分离》 基础才是重中之重~delegate里的Invoke和BeginInvoke 将不确定变为确定系列~目录(“机器最能证明一切”) 爱上MVC3系列~全局异常处理与异常日志 基础才是重中之重~lock和monitor的区别 将不确定变成确定~我想监视我的对象,如果是某个值,就叫另一些方法自动运行 将不确定变成确定~LINQ DBML模型可以对

    WPF MVVM UI分离之<交互与数据分离>   在我们使用WPF过程中,不可避免并且超级喜欢使用MVVM框架. 那么,使用MVVM的出发点是视觉与业务逻辑分离,即UI与数据分离 诸如下 ...

  2. Office365开发系列——开发一个全功能的Word Add-In

    2016年10月我参加了在北京举行的DevDays Asia 2016 - Office 365应用开发”48小时黑客马拉松“,我开发的一个Word Add-In Demo——WordTemplate ...

  3. 爱上MVC3系列~监视Action的运行时间,并提供超时记录机制

    回到目录 文章出现的原因 很久没写关于MVC的文章了,原因是将关注点移向了MVVM和DDD这边,而这篇文章完全是因为公司项目的需要,因为公司网站总是不定时的502,而这由可能是程序超时所引起的,为了分 ...

  4. 爱上MVC3系列~Html.BeginForm与Ajax.BeginForm

    Html.BeginForm与Ajax.BeginForm都是MVC架构中的表单元素,它们从字面上可以看到区别,即Html.BeginForm是普通的表单提交,而Ajax.BeginForm是支持异步 ...

  5. 利用ASP.NET里自带的站点地图工具制作网站站点地图

    站点地图很方便能快速给我们导航我们要去访问的地址,能按层级关系分门别类,给用户一个很好的用户体验,很好的看到自己当前所在的网站位置 站点地图,又称网站地图,它就是一个页面,上面放置了网站上所有页面的链 ...

  6. 转:ECharts图表组件之简单关系图:如何轻松实现另类站点地图且扩展节点属性实现点击节点页面跳转

    站点地图不外乎就是罗列一个网站的层次结构,提炼地讲就是一个关系结构图.那么我们如何巧用ECharts图表组件内的简单关系结构图来实现一个站点的地图结构呢?另外如何点击某个节点的时候实现页面跳转呢? 针 ...

  7. MVC借助MvcSiteMapProvider实现站点地图

    使用MvcSiteMapProvider可轻松实现站点地图,俗称"面包屑".如图: 通过NuGet,输入MvcSiteMapProvider搜索,并安装. 在Mvc.sitemap ...

  8. SharePoint 2013 图文开发系列之定义站点模板

    SharePoint站点模板是一个非常好的功能,方便我们开发一类网站,然后在此基础上做二次开发,对于SharePoint的使用,有着举足轻重的作用. 因为篇幅比较长,所以加上目录,方便大家查看: 一. ...

  9. [.NET领域驱动设计实战系列]专题九:DDD案例:网上书店AOP和站点地图的实现

    一.引言 在前面一专题介绍到,要让缓存生效还需要实现对AOP(面向切面编程)的支持.所以本专题将介绍了网上书店案例中AOP的实现.关于AOP的概念,大家可以参考文章:http://www.cnblog ...

随机推荐

  1. qq协助

    今天和一个朋友开完笑说让我进他的电脑,从而出现这篇文章!!!!   目前的QQ版本支持远程协助,所以想到通过两个QQ号码完成对另一台电脑的控制第一台电脑:1.自动登录QQ2.打开另一个QQ号码窗口3. ...

  2. loop 循环次数

    在汇编中可以使用 loop 段地址:偏移地址 并配合 cx 达到循环执行的目的,但是在一些资料中看到说,cx 是循环的次数,我觉得这是不对的. 比如下面这段代码的作用是使得最终的 ax 中的值为 3 ...

  3. 一句话的代码,从集合中找出第一个重复字符的方法javascript版。

    有的时候需求是这样的: 找出集合中第一个重复的字符所在的位置,刚才看了园内某自许为算法的代码,感觉非常之啰嗦故写了以下代码! 本人对神马算法之类的完全不懂,但那些伪算法家们也别出来装蒜.一句话:不要欺 ...

  4. Ajax参数详解

    1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为String类型的参数,请求方式(post或get)默认为get.注意其他http请求方法,例如 ...

  5. 详解在Visual Studio中使用git版本系统[转]

    这篇教程的预期,是希望没有任何版本使用基础的新手也可以掌握,所以细节较多,不当之处,欢迎指正. 一 .安装 git 开发工具 如果要使用 git 进行版本管理,其实使用 git 命令行工具就完全足够了 ...

  6. NIO概述

    NIO API从Java1.4开始引用起就被广泛应用所使用.NIO API自带了IO非阻塞操作. java.nio.*包的结构: · Buffers 作为数据容器 · Chartsets 将容器中的数 ...

  7. centos7.2进入单用户模式

    1 - 在启动grub菜单,选择编辑选项启动 2 - 按键盘e键,来进入编辑界面 3 - 找到Linux 16的那一行,将ro改为rw init=/sysroot/bin/sh 4 - 现在按下 Co ...

  8. Linux命令之route - 显示和操作IP路由表

    转自:  http://codingstandards.iteye.com/blog/1125312 用途说明 route命令用于显示和操作IP路由表(show / manipulate the IP ...

  9. DOS tasklist 命令(转)

    Dos命令之Tasklist用法及参数函义 2012-10-24 14:44:34|  分类: Windows |字号 订阅   TASKLIST [/S system [/U username [/ ...

  10. Poj.Grids 2951 浮点数求高精度幂

    2951:浮点数求高精度幂 总时间限制: 1000ms 内存限制: 65536kB 描述 有一个实数 R ( 0.0 < R < 99.999 ) ,要求写程序精确计算 R 的 n 次方. ...