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>
五、效果

浙公网安备 33010602011771号