冯 海

一个程序新人菜鸟的日记,希望大家多多关照。QQ:32316131

2018教程之mvc+ef + identity之七:角色权限系统菜单之读出的菜单写入SESSION送inspinia模板

节已完全的读出当前用户的菜单了,

可是用inspinia的比着DEMO,老是在第一个一级菜单为active

因为我当时选择的是 Html.RenderAction("_Navigation","Account")

每次都会选择第一个。

后来大牛教 用session

一、设置一个缓存帮助类,

T 泛型, T你传什么类型,就是什么类型,

现在是没有用到,这个适用于,所有用户获取的数据都一样时调用

建立一个目录:Common,新类CacheHelper.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace MYtest2018.Common
{
	public static class CacheHelper
	{
		/// <summary>
		/// 设置缓存
		/// </summary>
		/// <typeparam name="T">缓存值类型</typeparam>
		/// <param name="key">缓存键</param>
		/// <param name="value">值</param>
		/// <param name="ts">有效期</param>
		/// <returns></returns>
		public static bool Set<T>(string key, T value, TimeSpan ts)
		{

			try
			{
				System.Web.Caching.Cache cache = HttpRuntime.Cache;
				cache.Insert(key, value, null, DateTime.Now, ts);
			}
			catch (Exception)
			{

				return false;
			}
			return true;
		}

		/// <summary>
		/// 获取缓存
		/// </summary>
		/// <typeparam name="T">缓存值类型</typeparam>
		/// <param name="key">缓存键</param>
		/// <returns></returns>
		public static T Get<T>(string key)
		{
			T value = default(T);
			try
			{
				System.Web.Caching.Cache cache = HttpRuntime.Cache;
				object obj = cache.Get(key);
				if (obj != null)
				{
					return (T)obj;
				}
			}
			catch (Exception)
			{
				return value;
			}
			return value;
		}
	}
}

 

二,因为后台基本都要使用菜单,所以建一个基类控制器。

其他类继续这个类,注意关于role,usermanage ,还有DB的定义都会在基类控制器中,以后的类中需要删除,特别是Account控制器中多

 

using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Net;
using System.Security.Claims;
using System.Threading.Tasks;
using System.Web;
using System.Web.Mvc;
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.EntityFramework;
using Microsoft.AspNet.Identity.Owin;
using Microsoft.Owin.Security;
using MYtest2018.DAL;
using MYtest2018.Models;
using MYtest2018.ViewModels;
using PagedList;


namespace MYtest2018.Controllers
{
	//[Authorize]
	public class BaseController : Controller
	{
		protected MyDALContent db = new MyDALContent();
		private ApplicationSignInManager _signInManager;
		private ApplicationUserManager _userManager;
		private ApplicationRoleManager _roleManager;

		protected ApplicationRoleManager RoleManager
		{
			get { return _roleManager ?? Request.GetOwinContext().Get<ApplicationRoleManager>(); }
			set { _roleManager = value; }
		}
		protected ApplicationSignInManager SignInManager
		{
			get
			{
				return _signInManager ?? HttpContext.GetOwinContext().Get<ApplicationSignInManager>();
			}
			private set
			{
				_signInManager = value;
			}
		}

		protected ApplicationUserManager UserManager
		{
			get
			{
				return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
			}
			private set
			{
				_userManager = value;
			}
		}


		protected override void OnActionExecuted(ActionExecutedContext filterContext)
		{
			if (Request.IsAuthenticated)
			{

				List<MenuInfo> UserMenus = Session["menus"] as List<MenuInfo>;
				if (UserMenus == null)
				{

					///获取当前用户的id
					var userID = User.Identity.GetUserId();
					///先读出当前用户表对应的所有的ROLES表,但只有rolename.
					var rolses = UserManager.GetRoles(userID);
					///先读出当前用户的完整表.
					var alluser = UserManager.FindById(userID);
					///先读出当前所有的ROLES表.
					var allrolses = RoleManager.Roles.ToList();
					///皮配出这个用户ID的角色列表ID出来
					var user_roleid = allrolses.Where(x => rolses.Contains(x.Name)).Select(n => n.Id).ToList();
					//var rolses = RoleManager.Roles.ToList();
					//这里是所有角色,不是当前用户的角色
					//var roleIds = rolses.Select(m => m.id).ToList();
					var role_menus = db.RoleMenus.Where(m => user_roleid.Contains(m.RoleId)).ToList();//查询出角色关联表的所有数据
																									  //var role_menus = db.RoleMenus.Where(m =>m.RoleId== rolses.Select(x=>x.id) rolses.Contains(m.RoleId)).ToList();//查询出角色关联表的所有数据
					var menuIds = role_menus.Select(n => n.MenuId).ToArray();
					var menus = db.MenuInfos.OrderBy(x => x.Sort).Where(m => menuIds.Contains(m.Id)).ToList();//查询出菜单数据
																											  ///下面进行表的读成菜单样式
																											  ///定义一个变量result的MenuInfo列表变量
					var result333 = new List<MenuInfo>();
					///读出所有的一级菜单
					var level0 = menus.Where(m => m.Popedomfatherid == 0).ToList();
					///对所有一级菜单进行一次循环。 foreah (var xx in level0) 这种一样
					level0.ForEach(item =>
					{
						///定义一个children字菜单变量,当他的Popedomfatherid=当前循环的ID,取出当前的所有字菜单
						var children = menus.Where(m => m.Popedomfatherid == item.Id).ToList();
						/////给子菜单名字前面加上几个---
						//children.ForEach(m => m.MenuName = "------------" + m.MenuName);
						/////为新定义的result变量增加一个 一级菜单
						result333.Add(item);
						///为新定义的result变量增加一个 所有的字菜单
						result333.AddRange(children);
					});
					Session["menus"] = result333;
					UserMenus = result333;
				}

				ViewBag.Menu = UserMenus;
				base.OnActionExecuted(filterContext);

			}
			else
			{
				ViewBag.Menu = new List<MenuInfo>();
			}
		}


		protected override void Dispose(bool disposing)
		{
			if (disposing)
			{
				if (_userManager != null)
				{
					_userManager.Dispose();
					_userManager = null;
				}

				if (_signInManager != null)
				{
					_signInManager.Dispose();
					_signInManager = null;
				}
			}

			base.Dispose(disposing);
		}

	}
}

  

 

 

 

 红色的就是定义的菜单,并写入session哟。

三、布局而的页面的更改

<div id="wrapper">

		<!-- Navigation -->
		@Html.Partial("_Navigation", ViewBag.Menu as List<MYtest2018.Models.MenuInfo>)
		 
		<!-- Page wraper -->
		<div id="page-wrapper" class="gray-bg">

  

四、修改菜单分布页

@model IEnumerable<MYtest2018.Models.MenuInfo>

<nav class="navbar-default navbar-static-side" role="navigation">
	<div class="sidebar-collapse">
		<ul class="nav" id="side-menu">
			<li class="nav-header">
				<div class="dropdown profile-element">
					<a data-toggle="dropdown" class="dropdown-toggle" href="#">
						<span class="clear">
							<span class="block m-t-xs">
								<strong class="font-bold">Example user</strong>
							</span> <span class="text-muted text-xs block">Example menu @ViewBag.testname<b class="caret"></b></span>
						</span>
					</a>
					<ul class="dropdown-menu animated fadeInRight m-t-xs">
						<li><a href="#">Logout</a></li>
					</ul>
				</div>
				<div class="logo-element">
					IN+
				</div>
			</li>
			<li class="@Html.IsSelected(controller:"xxxxx", action: "Index")">
				<a href="@Url.Action("Index", "Admin")"><i class="fa fa-laptop"></i> <span class="nav-label">管理首页</span> </a>
			</li>
			@foreach (var user in Model)
			{
				if (user.Popedomfatherid == 0)
				{
					if (!string.IsNullOrEmpty(@user.MenuIcon))
					{
						<li class="@Html.IsSelected(controller:@user.ControllerName)">
							
							<a href="#"><i class=" @user.MenuIcon "></i> <span class="nav-label" data-i18n="nav.dashboard">@user.MenuName</span><span class="fa arrow"></span></a>
							<ul class="nav nav-second-level collapse @Html.IsSelected(controller:@user.ControllerName, cssClass: "in")">
								@foreach (var chilemenu in Model)
								{
									if (chilemenu.Popedomfatherid == user.Id)
									{
										<li class="@Html.IsSelected(action: @chilemenu.MethodName)"><a href="@Url.Action(@chilemenu.MethodName, @chilemenu.ControllerName)">@chilemenu.MenuName</a></li>
									}

								}

							</ul>
						</li>

					}
					else
					{

						<li class="@Html.IsSelected(action:@user.ControllerName)">
							<a href="@Url.Action(@user.MethodName,@user.ControllerName)"> <span class="nav-label">@user.MenuName</span></a>
						</li>

					}
				}
			}
			<li class="@Html.IsSelected(controller: "UIElements")">
				<a href="@Url.Action("ListRoles", "Account")"><i class="fa fa-flask"></i> <span class="nav-label" data-i18n="nav.uielements">角色管理</span><span class="fa arrow"></span></a>
				<ul class="nav nav-second-level collapse @Html.IsSelected(controller: "UIElements", cssClass: "in")">
					<li class="@Html.IsSelected(action: "ListRoles")"><a href="@Url.Action("ListRoles", "Account")">角色列表</a></li>
					<li class="@Html.IsSelected(action: "AddRoles")"><a href="@Url.Action("AddRoles", "Account")">新建角色</a></li>
				</ul>
			</li>
  
		</ul>
	</div>
</nav>

  

五、效果

 

 

 

 

 

 

 

 

posted @ 2018-09-14 22:02  秋天来了哟  阅读(263)  评论(0)    收藏  举报
认识就是缘份,愿天下人都快乐!
QQ: 32316131
Email: 32316131@qq.com