爱上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 = "" 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系列~开发一个站点地图(俗称面包屑)的更多相关文章
- WPF MVVM UI分离之《交互与数据分离》 基础才是重中之重~delegate里的Invoke和BeginInvoke 将不确定变为确定系列~目录(“机器最能证明一切”) 爱上MVC3系列~全局异常处理与异常日志 基础才是重中之重~lock和monitor的区别 将不确定变成确定~我想监视我的对象,如果是某个值,就叫另一些方法自动运行 将不确定变成确定~LINQ DBML模型可以对
WPF MVVM UI分离之<交互与数据分离> 在我们使用WPF过程中,不可避免并且超级喜欢使用MVVM框架. 那么,使用MVVM的出发点是视觉与业务逻辑分离,即UI与数据分离 诸如下 ...
- Office365开发系列——开发一个全功能的Word Add-In
2016年10月我参加了在北京举行的DevDays Asia 2016 - Office 365应用开发”48小时黑客马拉松“,我开发的一个Word Add-In Demo——WordTemplate ...
- 爱上MVC3系列~监视Action的运行时间,并提供超时记录机制
回到目录 文章出现的原因 很久没写关于MVC的文章了,原因是将关注点移向了MVVM和DDD这边,而这篇文章完全是因为公司项目的需要,因为公司网站总是不定时的502,而这由可能是程序超时所引起的,为了分 ...
- 爱上MVC3系列~Html.BeginForm与Ajax.BeginForm
Html.BeginForm与Ajax.BeginForm都是MVC架构中的表单元素,它们从字面上可以看到区别,即Html.BeginForm是普通的表单提交,而Ajax.BeginForm是支持异步 ...
- 利用ASP.NET里自带的站点地图工具制作网站站点地图
站点地图很方便能快速给我们导航我们要去访问的地址,能按层级关系分门别类,给用户一个很好的用户体验,很好的看到自己当前所在的网站位置 站点地图,又称网站地图,它就是一个页面,上面放置了网站上所有页面的链 ...
- 转:ECharts图表组件之简单关系图:如何轻松实现另类站点地图且扩展节点属性实现点击节点页面跳转
站点地图不外乎就是罗列一个网站的层次结构,提炼地讲就是一个关系结构图.那么我们如何巧用ECharts图表组件内的简单关系结构图来实现一个站点的地图结构呢?另外如何点击某个节点的时候实现页面跳转呢? 针 ...
- MVC借助MvcSiteMapProvider实现站点地图
使用MvcSiteMapProvider可轻松实现站点地图,俗称"面包屑".如图: 通过NuGet,输入MvcSiteMapProvider搜索,并安装. 在Mvc.sitemap ...
- SharePoint 2013 图文开发系列之定义站点模板
SharePoint站点模板是一个非常好的功能,方便我们开发一类网站,然后在此基础上做二次开发,对于SharePoint的使用,有着举足轻重的作用. 因为篇幅比较长,所以加上目录,方便大家查看: 一. ...
- [.NET领域驱动设计实战系列]专题九:DDD案例:网上书店AOP和站点地图的实现
一.引言 在前面一专题介绍到,要让缓存生效还需要实现对AOP(面向切面编程)的支持.所以本专题将介绍了网上书店案例中AOP的实现.关于AOP的概念,大家可以参考文章:http://www.cnblog ...
随机推荐
- Mac 下安装ruby,以及CocoaPods安装以及使用网摘
ruby安装网址:https://ruby-china.org/wiki/install_ruby_guide CocoaPods安装和使用教程地址:http://code4app.com/artic ...
- Android studio 多渠道打包
一般用渠道的统计无非是用友盟或者其它之类的,今天就以友盟的为例吧. 渠道信息一般在 AndroidManifest.xml中修改以下值: <meta-data android:name=&quo ...
- 天气预报API(一):全国城市代码列表(“旧编码”)
说明 2016-12-09 补充 (后来)偶然发现中国天气网已经有城市ID列表的网页... 还发现城市编码有两种,暂且称中国天气网这些编码为旧标准 "旧编码"的特征是 9个字符长度 ...
- IOS XIB Cell自适应高度实现
1.代码实现Cell高度自适应的方法 通过代码来实现,需要计算每个控件的高度,之后获取一个cell的 总高度,比较常见的是通过lable的文本计算需要的高度. CGSize labelsize = [ ...
- (完全背包 大数)Dollar Dayz (POJ 3181)
http://poj.org/problem?id=3181 Description Farmer John goes to Dollar Days at The Cow Store and disc ...
- js中,var 修饰变量名和不修饰的区别
js中 允许在定义变量的时候 不加var 修饰符.js会在当前作用域下寻找上下文是否定义了此变量, 如果没有找到则会为这个变量分配内存.当且将其视为window的成员. 也就是全局变量. 如果加了va ...
- WPF 自定义TextBox,可控制键盘输入内容
非原创,整理之前的代码的时候找出来的,可用,与大家分享一下! public class NumbericBoxWithZero : NumericBox { public NumbericBoxWit ...
- 命令行解析Crash文件
做了快两年的开发了,没有写过博客,最近公司app上架,程序崩溃被拒绝了,可是给的crash文件,又看不出哪里的问题,网上各种搜,终于找到了解决的办法,想想还是写个博客吧,希望给哪些也遇到这类问题的朋友 ...
- 关于普通定时器与高级定时器的 PWM输出的初始化的区别
不管是普通定时器还是高级定时器,你用哪个通道,就在程序里用OC多少.比如CH3对应OC3 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_ ...
- php中的mysql 和 mysqli 区别
mysql是非持续连接函数,每次链接都会打开一个连接进程 mysqli是持续连接函数,多次运行将使用同一连接进程,从而降低服务器开销.