回到目录

原来早在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. Mac 下安装ruby,以及CocoaPods安装以及使用网摘

    ruby安装网址:https://ruby-china.org/wiki/install_ruby_guide CocoaPods安装和使用教程地址:http://code4app.com/artic ...

  2. Android studio 多渠道打包

    一般用渠道的统计无非是用友盟或者其它之类的,今天就以友盟的为例吧. 渠道信息一般在 AndroidManifest.xml中修改以下值: <meta-data android:name=&quo ...

  3. 天气预报API(一):全国城市代码列表(“旧编码”)

    说明 2016-12-09 补充 (后来)偶然发现中国天气网已经有城市ID列表的网页... 还发现城市编码有两种,暂且称中国天气网这些编码为旧标准 "旧编码"的特征是 9个字符长度 ...

  4. IOS XIB Cell自适应高度实现

    1.代码实现Cell高度自适应的方法 通过代码来实现,需要计算每个控件的高度,之后获取一个cell的 总高度,比较常见的是通过lable的文本计算需要的高度. CGSize labelsize = [ ...

  5. (完全背包 大数)Dollar Dayz (POJ 3181)

    http://poj.org/problem?id=3181 Description Farmer John goes to Dollar Days at The Cow Store and disc ...

  6. js中,var 修饰变量名和不修饰的区别

    js中 允许在定义变量的时候 不加var 修饰符.js会在当前作用域下寻找上下文是否定义了此变量, 如果没有找到则会为这个变量分配内存.当且将其视为window的成员. 也就是全局变量. 如果加了va ...

  7. WPF 自定义TextBox,可控制键盘输入内容

    非原创,整理之前的代码的时候找出来的,可用,与大家分享一下! public class NumbericBoxWithZero : NumericBox { public NumbericBoxWit ...

  8. 命令行解析Crash文件

    做了快两年的开发了,没有写过博客,最近公司app上架,程序崩溃被拒绝了,可是给的crash文件,又看不出哪里的问题,网上各种搜,终于找到了解决的办法,想想还是写个博客吧,希望给哪些也遇到这类问题的朋友 ...

  9. 关于普通定时器与高级定时器的 PWM输出的初始化的区别

    不管是普通定时器还是高级定时器,你用哪个通道,就在程序里用OC多少.比如CH3对应OC3 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;  TIM_ ...

  10. php中的mysql 和 mysqli 区别

    mysql是非持续连接函数,每次链接都会打开一个连接进程 mysqli是持续连接函数,多次运行将使用同一连接进程,从而降低服务器开销.