首先打开vs--> 新建项-->选择站点地图.

站点地图建好了  其中具体的节点根据自己情况配好就行。

接下来是两个非常重要的类:

using System.Collections.Generic;
using System.Web.Routing; //code from Telerik MVC Extensions
namespace PowerInspact.Menu
{
public class SiteMapNode
{
/// <summary>
/// Initializes a new instance of the <see cref="SiteMapNode"/> class.
/// </summary>
public SiteMapNode()
{
RouteValues = new RouteValueDictionary();
ChildNodes = new List<SiteMapNode>();
} /// <summary>
/// Gets or sets the title.
/// </summary>
/// <value>The title.</value>
public string Title { get; set; } /// <summary>
/// Gets or sets the name of the controller.
/// </summary>
/// <value>The name of the controller.</value>
public string ControllerName { get; set; } /// <summary>
/// Gets or sets the name of the action.
/// </summary>
/// <value>The name of the action.</value>
public string ActionName { get; set; } /// <summary>
/// Gets or sets the route values.
/// </summary>
/// <value>The route values.</value>
public RouteValueDictionary RouteValues { get; set; } /// <summary>
/// Gets or sets the URL.
/// </summary>
/// <value>The URL.</value>
public string Url { get; set; } /// <summary>
/// Gets or sets the child nodes.
/// </summary>
/// <value>The child nodes.</value>
public IList<SiteMapNode> ChildNodes { get; set; } /// <summary>
/// Gets or sets the image path
/// </summary>
/// <value>The name of the image path.</value>
public string ImageUrl { get; set; } /// <summary>
/// Gets or sets the item is visible
/// </summary>
/// <value>A value indicating whether the item is visible</value>
public bool Visible { get; set; }
}
}
//code from Telerik MVC Extensions

using System;
using System.IO;
using System.Linq;
using System.Web.Routing;
using System.Xml;
namespace PowerInspact.Menu
{
public class XmlSiteMap
{
public XmlSiteMap()
{
RootNode = new SiteMapNode();
} public SiteMapNode RootNode { get; set; } public virtual SiteMapNode LoadFrom(string physicalPath)
{
string str = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
string content = File.ReadAllText(str + physicalPath); if (!string.IsNullOrEmpty(content))
{
using (var sr = new StringReader(content))
{
using (var xr = XmlReader.Create(sr,
new XmlReaderSettings
{
CloseInput = true,
IgnoreWhitespace = true,
IgnoreComments = true,
IgnoreProcessingInstructions = true
}))
{
var doc = new XmlDocument();
doc.Load(xr); if ((doc.DocumentElement != null) && doc.HasChildNodes)
{
XmlNode xmlRootNode = doc.DocumentElement.FirstChild;
Iterate(RootNode, xmlRootNode);
}
}
}
}
return RootNode;
} private static void Iterate(SiteMapNode siteMapNode, XmlNode xmlNode)
{
PopulateNode(siteMapNode, xmlNode); foreach (XmlNode xmlChildNode in xmlNode.ChildNodes)
{
if (xmlChildNode.LocalName.Equals("siteMapNode", StringComparison.InvariantCultureIgnoreCase))
{
var siteMapChildNode = new SiteMapNode();
siteMapNode.ChildNodes.Add(siteMapChildNode); Iterate(siteMapChildNode, xmlChildNode);
}
}
} private static void PopulateNode(SiteMapNode siteMapNode, XmlNode xmlNode)
{
try
{
//title
siteMapNode.Title = GetStringValueFromAttribute(xmlNode, "title");
//routes, url
string controllerName = GetStringValueFromAttribute(xmlNode, "controller");
string actionName = GetStringValueFromAttribute(xmlNode, "action");
string url = GetStringValueFromAttribute(xmlNode, "url");
if (!string.IsNullOrEmpty(controllerName) && !string.IsNullOrEmpty(actionName))
{
siteMapNode.ControllerName = controllerName;
siteMapNode.ActionName = actionName; }
else if (!string.IsNullOrEmpty(url))
{
siteMapNode.Url = url;
} //image URL
siteMapNode.ImageUrl = GetStringValueFromAttribute(xmlNode, "ImageUrl"); //permission name
var permissionNames = GetStringValueFromAttribute(xmlNode, "PermissionNames"); string pers=System.Web.HttpContext.Current.Session["persioons"].ToString(); string[] arr1 = pers.Substring(, pers.Length-).Split(','); //当前该用户的权限 if (siteMapNode.Title == "组织/企业管理" || siteMapNode.Title == "检测报告" || siteMapNode.Title == "系统设置" || siteMapNode.Title == "标准库" || siteMapNode.Title == "用户设置")
{
string[] arr = permissionNames.Split(',');
if (IsVisible(arr, arr1))
{
siteMapNode.Visible = true;
}
else
{
siteMapNode.Visible = false; ;
}
}
else
{
if (IsVisible(arr1, permissionNames))
{
siteMapNode.Visible = true;
}
else
{
siteMapNode.Visible = false; ;
}
}
}
catch (Exception)
{
} }
public static bool IsVisible(string[] arr, string[] arr1)
{
bool b = false;
for (int i = ; i < arr.Length; i++)
{
for (int j = ; j < arr1.Length; j++)
{
if (arr[i] == arr1[j])
{
b = true;
break;
}
}
}
return b;
}
public static bool IsVisible(string[] arr, string permissionNames)
{
bool b = false;
for (int i = ; i < arr.Length; i++)
{
if (permissionNames == arr[i])
{
b = true;
break;
}
}
return b;
}
private static string GetStringValueFromAttribute(XmlNode node, string attributeName)
{
string value = null; if (node.Attributes.Count > )
{
XmlAttribute attribute = node.Attributes[attributeName]; if (attribute != null)
{
value = attribute.Value;
}
} return value;
}
}
}

这两个类完全可以直接拿去用,只是第二个类里面有一些判断要改一下(登陆成功是否显示),其他都不用动。

最后来看看在母版页里如何调用:

<!-- 左边菜单栏 style can be found in sidebar.less -->
<ul class="sidebar-menu" data-widget="tree">
<li class="header">MAIN NAVIGATION</li> @{
string strUrl = Request.Url.ToString();
//load sitemap 注意命名空间
var siteMap = new PowerInspact.Menu.XmlSiteMap();
PowerInspact.Menu.SiteMapNode Nodes = siteMap.LoadFrom("sitemap.config"); //注意站点地图路劲
string str = "";
if (Nodes.ChildNodes.Count > )
{ for (int i = ; i < Nodes.ChildNodes.Count; i++) //父级
{
if (Nodes.ChildNodes[i].Visible)
{
bool IsActive=false;
string[] Persionns = Nodes.ChildNodes[i].ImageUrl.ToString().Split(',');
for (int k = ; k < Persionns.Length; k++)
{
if (strUrl.Contains(Persionns[k]))
{
IsActive = true;
}
} string ico = "";
if (IsActive)
{
ico = "fa-suitcase";
str += " <li class='active treeview'>";
}
else
{
ico = "fa-cogs";
str += " <li class='treeview'>";
}
if (Nodes.ChildNodes[i].ChildNodes.Count > ) //子级fa fa-cogs fa-suitcase
{ str += "<a href='#'><i class='fa "+ico+"'></i><span>" + Nodes.ChildNodes[i].Title + "</span><span class='pull-right-container'><i class='fa fa-angle-left pull-right'></i></span></a>";
str += "<ul class='treeview-menu left_menu'>";
for (int j = ; j < Nodes.ChildNodes[i].ChildNodes.Count; j++)
{
if (Nodes.ChildNodes[i].ChildNodes[j].Visible)
{
if (strUrl.Contains(Nodes.ChildNodes[i].ChildNodes[j].ControllerName))
{
str += @"<li class='active'><a href='/" + Nodes.ChildNodes[i].ChildNodes[j].ControllerName + "'><i class='fa fa-circle-o'></i>" + Nodes.ChildNodes[i].ChildNodes[j].Title + "</a></li>";
}
else
{
str += @"<li><a href='/" + Nodes.ChildNodes[i].ChildNodes[j].ControllerName + "'><i class='fa fa-circle-o'></i>" + Nodes.ChildNodes[i].ChildNodes[j].Title + "</a></li>";
} }
}
str += "</ul>";
}
str += "</li>"; }
} } ViewData["strhtnl"] = str;
}
@Html.Raw(ViewData["strhtnl"])</ul>

用sitemap做主页的菜单栏的更多相关文章

  1. QiyeProject SpringMVC 项目 d15866p148.iok.la 主要做主页应用,消息应用不管了 用户微信号有点像乱码的那个是openID 找同伴:在项目的GitHub页面里找提问过的人,还有fork,star的人

    消息型应用支持文本.图片.语音.视频.文件.图文等消息类型. 主页型应用只支持文本消息类型,且文本长度不超过20个字. 填写必要信息 URL /QiyeProject/src/org/oms/qiye ...

  2. 使用Hexo+Github一步步搭建属于自己的博客(进阶)

    主题的配置:这里以NexT主题作为题材 1.安装NexT,在其文件夹中鼠标右键,点击Git Base Here.输入命令:git clone https://github.com/iissnan/he ...

  3. vuejs、eggjs全栈式开发设备管理系统

    vuejs.eggjs全栈式开发简单设备管理系统 业余时间用eggjs.vuejs开发了一个设备管理系统,通过mqtt协议上传设备数据至web端实时展现,包含设备参数分析.发送设备报警等模块.收获还是 ...

  4. iOS的非常全的三方库,插件,大牛博客

    转自: http://www.cnblogs.com/zyjzyj/p/6015625.html github排名:https://github.com/trending, github搜索:http ...

  5. 使用Hexo+Github搭建属于自己的博客(进阶)

    主题的配置:这里以NexT主题作为题材 1.安装NexT,在其文件夹中鼠标右键,点击Git Base Here.输入命令:git clone https://github.com/iissnan/he ...

  6. iOS 强大第三方资源库

    Github用法 git-recipesGit recipes in Chinese. 高质量的Git中文教程. lark怎样在Github上面贡献代码 my-git有关 git 的学习资料 giti ...

  7. vuejs、eggjs、mqtt

    vuejs.eggjs.mqtt全栈式开发设备管理系统 vuejs.eggjs.mqtt全栈式开发简单设备管理系统 业余时间用eggjs.vuejs开发了一个设备管理系统,通过mqtt协议上传设备数据 ...

  8. vuejs、eggjs、mqtt全栈式开发设备管理系统

    vuejs.eggjs.mqtt全栈式开发简单设备管理系统 业余时间用eggjs.vuejs开发了一个设备管理系统,通过mqtt协议上传设备数据至web端实时展现,包含设备参数分析.发送设备报警等模块 ...

  9. Jquery Easy UI初步学习(一)

    Easy UI 1.3.2 以前听说Easy UI很不错,当了一个dome,闲着没事就看了一下,也整理一下为了自己更好的记忆,也希望对象我这样小菜有帮助吧 先从后台管理的主页面开始,如要要做主页需要了 ...

随机推荐

  1. Django路由层

    路由层简单配置 urlpatterns = [ url(r'^admin/$', admin.site.urls), url(r'^articles/2003/$', views.special_ca ...

  2. vertica系列:解锁table

    Vertica 表发生死锁后, 通过下面3个查询即可解锁. --步骤1: 找到被锁表的 transaction_idselect transaction_id, t.* from v_monitor. ...

  3. Python 连接MongoDB并比较两个字符串相似度的简单示例

    本文介绍一个示例:使用 pymongo 连接 MongoDB,查询MongoDB中的 字符串 记录,并比较字符串之间的相似度. 一,Python连接MongoDB 大致步骤:创建MongoClient ...

  4. 五.HashTable原理及实现学习总结

    有两个类都提供了一个多种用途的hashTable机制,他们都可以将可以key和value结合起来构成键值对通过put(key,value)方法保存起来,然后通过get(key)方法获取相对应的valu ...

  5. Devexpress Winform 使用MVVM

    MVVM在WPF里很早就有了,在Winform里Devexpress最近几个大版本才有的事,上一段代码. 现在对话框上添加三个控件simpleButton1,simpleButton2,textEdi ...

  6. Java8新特性 重复注解与类型注解

    import java.lang.annotation.Repeatable; import java.lang.annotation.Retention; import java.lang.anno ...

  7. MQTT学习笔记

    因为工作需要,了解了一下MQTT.顺便记下来,现在还不会用. 一.概述 MQTT(Message Queuing Telemetyr Transport  消息队列遥测传输协议):基于发布/订阅(Pu ...

  8. 第20月第29天 cocoa抽象工厂 cocoapods组件化 cocoapods升级

    1. 在 Cocoa Touch 框架中,类簇是抽象工厂模式在 iOS 下的一种实现,以 NSArray 举例,将原有的 alloc+init 拆开写: id obj1 = [NSArray allo ...

  9. NEX 事件

    我正在上班突然看到这个事情差点没笑抽. 转自纯洁的微笑:原文在此:http://www.cnblogs.com/ityouknow/p/9247842.html#4010697 大家知道 VIVO 上 ...

  10. vue使用element-ui的el-input监听不了键盘事件解决

    vue使用element-ui的el-input监听不了键盘事件,原因应该是element-ui自身封装了一层div在input标签外面,把原来的事件隐藏了,所以如下代码运行是无响应的: <el ...