后台的左侧的菜单是要根据不同的角色登录有不同的显示,怎么实现哩?
1.后台布局页面的调用
首先在我所有的后台布局页_AdminLayout 中增加一个分布局的引用
其中:
@Html.Action("Menu", "Menus")
调用Menus控制器中Menu方法
下面的:
@RenderBody() ///布局页面调用的主体
2.新建一个数据模型。
我是在ViewModel下新建LeftMenus.cs,其中字段为MenuRoles表中的内容,实际 我就图方便,复制了一个Model中的Menu.cs的内容
using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Web; namespace jsdhh2.ViewModels { public class LeftMenus { ////// 菜单ID /// [Display(Name = "菜单id")] public string Id { get; set; } ////// 上级ID /// [Display(Name = "上级菜单Id")] public string ParentId { get; set; } ////// 名称 /// [Display(Name = "菜单名称")] public string Name { get; set; } ////// URL /// [Display(Name = "菜单网址")] public string Url { get; set; } ////// 排序越大越靠后 /// [Display(Name = "排序数字")] public int Order { get; set; } ////// 菜单类型 /// [Display(Name = "类型")] public string MenuType { get; set; } ////// 创建日期 /// /// [Display(Name = "菜单样式")] public string MenuCss { get; set; } [Display(Name = "菜单图标")] public string MenuIcon { get; set; } ////// 菜单类型名称 /// [Display(Name = "小标样式")] public string MenuSmallCss { get; set; } [Display(Name = "小标内容")] public string MenuSmallValue { get; set; } public string Code { get; set; } } }
3.写Menus控制器下Menu方法
// GET: Menus-layout //public async TaskPermissions(string roleNamel) [ChildActionOnly] //局部子视图调用 public ActionResult Menu() { string _rolename = Session["role"].ToString(); //找到在home/index方法中存入的Session[role]值给变量 if (_rolename == "无") //随便加的一个可能有问题 { return NewMethod(); } var menuroles = (from m in db.Menus ///这个地方,我干了三天,原来必须要括进来,改为.TolIST(),因为EF是延迟加载,不执行,要选ToList() 就会转为SQL执行,也就不会产生Null,到时提示引入模型不正确。 join mr in db.MenuRoles on m.Id equals mr.MenuId where mr.RoleName == _rolename select new LeftMenus { Id=m.Id, ParentId=m.ParentId, Name=m.Name, Url=m.Url, Order =m.Order, MenuType =m.MenuType, MenuCss =m.MenuCss , MenuIcon =m.MenuIcon , MenuSmallCss =m.MenuSmallCss , MenuSmallValue =m.MenuSmallValue }) .ToList(); return View(menuroles); //返回模型 //return PartialView("Menu"); //return View(await db.Menus.ToListAsync()); }
5.Menu分布局的前台
按在头部进行引用,因为用了ToList(),所以要改为:这里也相当重要呀。
@model IList@{ Layout = null; }
为了先达到效果,我在Menu中加入了一个foreach,读出来再说
然后前台的遍历就很重要了,这里再次感觉
】芭娜娜Banana²º¹⁷ 老师的无私教学,呵。 因为adminlte的头上部有好多LI,我就只复制了显示菜单的这部份
@foreach (var item in Model.Where(n => n.ParentId == null)) { if (Model.Where(m => m.ParentId == item.Id).Count() == 0) {
效果图
然后可以自己加一起图标,比如二级的