首先打开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. IIS Express URL Rewrite无效

    点击一下项目,再选择属性选项卡(不是右键属性) 如上图,如果托管管道模式是集成的话,改为经典即可.如果在vs2010的 WebDev.WebServer40方式启动 默认就是经典模式

  2. 卷积中的full、same、valid

    通常用外部api进行卷积的时候,会面临mode选择. 本文清晰展示三种模式的不同之处,其实这三种不同模式是对卷积核移动范围的不同限制. 设 image的大小是7x7,filter的大小是3x3     ...

  3. ubuntu18.04中安装和卸载cuDNN

    udnn安装注意点: cudnn的安装其实很简单,关键点是一定要安装cuda对应的cudnn包,本机中安装的cuda7.5所以对应的cudnn为v5.1这很重要,我就是安装错了版本,导致后面caffe ...

  4. deque

    转自:https://www.cnblogs.com/LearningTheLoad/p/7450948.html deque双向开口可进可出的容器 我们知道连续内存的容器不能随意扩充,因为这样容易扩 ...

  5. ue4动画蓝图

    动画资源 animation sequence  序列动画 :一帧一骨骼 montage   片断动画 : 动画蒙太奇   将不同的片断组成一个动画 blend space    混合动画  : 将2 ...

  6. redis非关系型数据库的基本语法

    导入并连接数据库: import redis # 导入redis模块,通过python操作redis 也可以直接在redis主机的服务端操作缓存数据库 import time # host是redis ...

  7. 剑指Offer-第一个只出现一次的字符位置

    题目描述 在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置 思路 思路一: 使用整型数组对出现次数进行统计. 思路二: 使用Bit ...

  8. Django REST framework 第六章 ViewSets & Routers

    REST framework包含了一个可以处理ViewSets的抽象, 它允许开发人员专注于API的状态跟交互进行建模,并使得URL构建结构基于通用的约定自动处理. ViewSet类跟View类几乎相 ...

  9. MySQL - GROUP BY和HAVING的用法

    按姓名分组查询 SELECT username, COUNT(username) AS '人数' FROM t_user GROUP BY username 只查询姓名相同的人 SELECT user ...

  10. CNN学习入门

    https://blog.csdn.net/ice_actor/article/details/78648780