用sitemap做主页的菜单栏
首先打开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做主页的菜单栏的更多相关文章
- QiyeProject SpringMVC 项目 d15866p148.iok.la 主要做主页应用,消息应用不管了 用户微信号有点像乱码的那个是openID 找同伴:在项目的GitHub页面里找提问过的人,还有fork,star的人
消息型应用支持文本.图片.语音.视频.文件.图文等消息类型. 主页型应用只支持文本消息类型,且文本长度不超过20个字. 填写必要信息 URL /QiyeProject/src/org/oms/qiye ...
- 使用Hexo+Github一步步搭建属于自己的博客(进阶)
主题的配置:这里以NexT主题作为题材 1.安装NexT,在其文件夹中鼠标右键,点击Git Base Here.输入命令:git clone https://github.com/iissnan/he ...
- vuejs、eggjs全栈式开发设备管理系统
vuejs.eggjs全栈式开发简单设备管理系统 业余时间用eggjs.vuejs开发了一个设备管理系统,通过mqtt协议上传设备数据至web端实时展现,包含设备参数分析.发送设备报警等模块.收获还是 ...
- iOS的非常全的三方库,插件,大牛博客
转自: http://www.cnblogs.com/zyjzyj/p/6015625.html github排名:https://github.com/trending, github搜索:http ...
- 使用Hexo+Github搭建属于自己的博客(进阶)
主题的配置:这里以NexT主题作为题材 1.安装NexT,在其文件夹中鼠标右键,点击Git Base Here.输入命令:git clone https://github.com/iissnan/he ...
- iOS 强大第三方资源库
Github用法 git-recipesGit recipes in Chinese. 高质量的Git中文教程. lark怎样在Github上面贡献代码 my-git有关 git 的学习资料 giti ...
- vuejs、eggjs、mqtt
vuejs.eggjs.mqtt全栈式开发设备管理系统 vuejs.eggjs.mqtt全栈式开发简单设备管理系统 业余时间用eggjs.vuejs开发了一个设备管理系统,通过mqtt协议上传设备数据 ...
- vuejs、eggjs、mqtt全栈式开发设备管理系统
vuejs.eggjs.mqtt全栈式开发简单设备管理系统 业余时间用eggjs.vuejs开发了一个设备管理系统,通过mqtt协议上传设备数据至web端实时展现,包含设备参数分析.发送设备报警等模块 ...
- Jquery Easy UI初步学习(一)
Easy UI 1.3.2 以前听说Easy UI很不错,当了一个dome,闲着没事就看了一下,也整理一下为了自己更好的记忆,也希望对象我这样小菜有帮助吧 先从后台管理的主页面开始,如要要做主页需要了 ...
随机推荐
- 细说REST API安全之防止数据篡改
通常可以使用MD5或SHA-1对API参数进行签名,在服务器端通过校验签名结果来验证数据是否被修改. 举个例子:添加用户 地址:http://192.168.0.10/v1/user/add?sign ...
- ****** 四十二 ******、软设笔记【软件知识产权保护】-Internet和Intranet基础
知识产权保护 著作权法及实施条例 <中华人民共和国著作权法>及其实施条例,明确了保护文学.艺术和科学作品作者的著作权,以及与其相关的权益. 依据改法,我国不仅对文字产品,口述作品,音乐.戏 ...
- MySQL之数据表的插入内容 空与非空(六)
NULL与NOT NULL mysql> CREATE TABLE tb2( -> usename VARCHAR(20) NOT NULL, -> age TINYINT UNSI ...
- oracle 根据在线更新分区。
LOG_PURCHASEINFO 是没有分区之前的表,根据 LOG_PURCHASEINFO_P 分区好的表在线更新 LOG_PURCHASEINFO表,让他变成分区表.11g才可以使用list_ra ...
- html去掉滑动条
实例: .week { /*text-align: left;*/ /*display: inline-table;*/ margin: 0 auto; padding: 0; list-style: ...
- 2017CCPC秦皇岛 M题Safest Buildings&&ZOJ3993【复杂模拟】
题意: 给出两个半径R,r,R表示第一次的大圈半径,r表示第二次的小圈半径.第一次大圈的圆心位于(0,0),第二次小圈的圆心未知,但在大圈内,给你一个n,然后给出n个屋子的位置,问这些屋子中,第二次在 ...
- java包装类型的坑
开发中有遇到Long类型比较是否相等,比如Long A和Long B判断是否相等,当时习惯性的直接A==B: 自测的话确实么有问题,但是测试那边测试就有问题,当时郁闷了一下然后换成了A.equals( ...
- Microsoft SQL - 指令
exec指令 查询数据库详细状态 exec sp_helpdb 数据库名称 修改数据库名称 exec sp_rename oldname,new_name 查看表状态 exec sp_help 表名称 ...
- JavaScript编程基础2
1,数据类型相关操作 使用typeof x函数查看变量的数据类型: typeof "John" // 返回 string typeof 3.14 // 返回 number type ...
- Akka Quickstart with Java-笔记
官方文档: http://developer.lightbend.com/guides/akka-quickstart-java/?_ga=2.177525157.1012573474.1504767 ...