回到目录

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

    Fire 分析: 首先,明确题意:b1,b2,--,bn 交换为b2,--,bn,b1,但这并不是意味着只能从b1开始交换,(这点从样例中可以看出),并且也不意味着交换的必须是连续的一串,可以是几个单 ...

  2. Slide-卡盘效果

    <div style="width:950px;height:705px;"> <div class="J_TWidget" data-wid ...

  3. SqlServer自动化分区

    1.新增文件组 ALTER DATABASE [Test] ADD FILEGROUP FG2010 ALTER DATABASE [Test] ADD FILEGROUP FG2011 ALTER ...

  4. 数学工具之mathgv

    做科研时,数学必不可少,有时要看一个方程的很多特性,当然,自己了解的当然好,可要是碰到复杂的,一下子是看不出来,这个时候借助数学工具可以很好地画出来,这里介绍mathgv这个软件. 此软件是开源的,使 ...

  5. 黑马程序员_Java基础:多线程总结

    ------- android培训.java培训.期待与您交流! ---------- 一.多线程的概念 进程和线程经常会被人混淆,那是因为对它们的概念不明确.就拿我们平时使用的操作系统来说,它是多任 ...

  6. HTML与CSS基础知识补遗(一)

    开始从零基础系统地学习前端知识了,虽说html和css多少了解一些,但是学着还是能发现很多新大陆.... 一. HTML中head标签 1. <meta>标签: meta标签里是一些基础的 ...

  7. 《LINUX内核设计与实现》读书笔记之第五章

    第五章——系统调用 5.1 与内核通信 1.为用户空间提供一种硬件的抽象接口 2.保证系统稳定和安全 3.除异常和陷入,是内核唯一的合法入口. API.POSIX和C库 关于Unix接口设计:提供机制 ...

  8. 关于Xcode7中添加不了libresolv.dylib等类似库的问题

    Xcode7中,由于某些机制,使得我们在添加类似于 libresolv.dylib.libz.dylib等库的时候,直接在Build Phases中点击加号添加,似乎已经无法找到相应的库.此时,我们可 ...

  9. 安卓模拟器的报错This AVD's configuration is missing a kernel file!!

    安卓模拟器的报错: 可能的原因是target设置问题:

  10. java分布式事务

    1.现有方案 a.atomikos b.jotm 说明:spring3.0已将jotm的支持踢掉 2.使用atomikos时的pom.xml内容 <!-- 分布式事务支持-atomikos-be ...