我的MvcSiteMap地图主要由实体文件,XML配置文件,C#调用文件组成,当然为了前台调用方法,可以为HtmlHelper添加一个扩展方法

第一步 定义站点地图实体

 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
{
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>

第三步:地图核心代码

 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>

MVC小系列(十九)【mvc与站点地图】的更多相关文章

  1. MVC小系列(九)【引入namespace】

    以前在页面引入一个namespace,可以这样: <%@ Import Namespace="Web.Helpers" %> 如果空间是所有页面都需要的,可以写进配置文 ...

  2. MVC小系列(八)【改变Areas的FindView顺序】

    MVC小系列(八)[改变Areas的FindView顺序] 一般项目比较大的话,会根据模块建立Areas,这样结构清晰,也有利于路由的部署, 1 Areas下有自己的_LayOut模板,而如果希望所有 ...

  3. MVC小系列(七)【分部视图中的POST】

    MVC小系列(七)[分部视图中的POST] 在PartialView中进行表单提交的作用:1 这个表单不止一个地方用到,2 可能涉及到异步的提交问题 这两种情况都可能需要把表单建立在分部视图上, 使用 ...

  4. Web 前端开发精华文章集锦(jQuery、HTML5、CSS3)【系列十九】

    <Web 前端开发精华文章推荐>2013年第七期(总第十九期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各种增强网站用户体验的 jQuery 插件,展示前沿的 HTML5 和 C ...

  5. 学习ASP.NET Core Razor 编程系列十九——分页

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  6. MVC自学系列之三(MVC视图-Views)

    View的约定 1.根据约定,Views目录下包含着每一个与Controller同名但是没有像Controller后缀的文件夹:因此对于控制器HomeController就对应在views目录下有个目 ...

  7. Katalon系列十九:元素相同或无法定位时的定位技巧

    经常看到有人问元素属性都相同,怎么定位,这里总结一下.下面以Xpath为例讲解,CSS其实也是一样的,只是语法不一样罢了.网上说CSS会比Xpath快一些,但在Katalon主用Xpath,感觉也还行 ...

  8. MVC小系列(二十二)【MVC的Session超时,导致的跳转问题】

    由于mvc内部跳转机制的问题,它只在当前的action所渲染的view上进行跳转,如果希望在当前页面跳,需要将mvc方法改为js方法: filterContext.Result = new Redir ...

  9. MVC小系列(十八)【给checkbox和radiobutton添加集合的重载】

    mvc对DropDownListFor的重载很多,但对checkbox和radiobutton没有对集合的重载 所以该讲主要针对集合的扩展: #region 复选框扩展 /// <summary ...

随机推荐

  1. vpn分配多ip的配置

    1,创建vpn路由和远程访问 --配置并启用和路由远程访问--自定义配置--选择“vpn访问”,“nat和基本防火墙. 2,vpn配置ip路由选择(nat/基本防火墙)--新增接口(选择本地网卡)-- ...

  2. linux下的rbenv和rails安裝

    今天是周一,我到新公司的第14天,今天继续linux下ruby和rails环境变量的配置. 首先碰到的问题是 主要看ubuntu下安装rbenv,ruby,rails开发环境, http://blog ...

  3. HW5.24

    import java.util.Calendar; public class Solution { public static void main(String[] args) { System.o ...

  4. IT的工作是这样?

    天若有情天亦老,人干IT死得早; 谁知盘中餐,IT老加班; 锦瑟无端五十弦, 我做PM净贴钱; 庄生晓梦迷蝴蝶, 领导客户是大爷; 沧海月明珠有泪, 吃亏受气也开会; 蓝田日暖玉生烟, 可怜人生已跑偏 ...

  5. hdoj 3549 Flow Problem【网络流最大流入门】

    Flow Problem Time Limit: 5000/5000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Tota ...

  6. jquery 模块拖拽

    这是模块拖拽Javascript代码 $(function(){ var _move=false;//移动标记 var _x,_y;//鼠标离控件左上角的相对位置 $(".drag" ...

  7. mysql字符串分割函数(行转列)

    由于工作需要需要处理一些以逗号分隔的字符串,每次都要现做很是麻烦,网上找了很多都没有现成的,好吧,自己动手写一个好了 )) ) BEGIN /*函数功能: 把带逗号的字符串分割取出 参数: num 要 ...

  8. python module的结构

    python有很多module,下面是module的结构图: 拿httplib做例子,httlip module有: 4个class( HTTPConnection,HTTPSConnection,H ...

  9. STM32 驱动12864液晶显示汉字、图片、画点、横线、竖线、斜线

    我做本实验的软件平台为MDK软件,选用STM32VET6,12864液晶屏5v供电采用并行接法.之前本来想网上找一个现成的程序实验一下,但都没找到合适的,于是就自己编写了一个,最终可在12864液晶屏 ...

  10. [Javascript] Ex: concatAll, map and filter

    concatAll: Array.prototype.concatAll = function() { var results = []; this.forEach(function(subArray ...