首先identity就有权限控制,可我们要让不同的人登录进后台,能看见不同的菜单。有没有权限操作是一个,看不看得见是另一个要求。
一、模型设计:
1.先建 Menu模弄,在Models下新建Menu.cs 模型。
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;
namespace jsdhh2.Models
{
public class Menu
{
/// <summary>
/// 菜单ID
/// </summary>
[Display(Name = "菜单id")]
public string Id { get; set; }
/// <summary>
/// 上级ID
/// </summary>
[Display(Name = "上级菜单Id")]
public string ParentId { get; set; }
/// <summary>
/// 名称
/// </summary>
[Display(Name = "菜单名称")]
public string Name { get; set; }
/// <summary>
/// URL
/// </summary>
[Display(Name = "菜单网址")]
public string Url { get; set; }
/// <summary>
/// 排序越大越靠后
/// </summary>
[Display(Name = "排序数字")]
public int Order { get; set; }
/// <summary>
/// 菜单类型,后其比如是1为菜单,2为按钮,3为模块,这样来。提前考虑。
/// </summary>
[Display(Name = "类型")]
public string MenuType { get; set; }
/// <summary>
/// 这个地方,是为了更好接轨adminlte,以后可以在这输入你自己的class,达到LI样式的变化
/// </summary>
///
[Display(Name = "菜单样式")]
public string MenuCss { get; set; }
/// <summary> /// 这个地方,就是为了达到显示LI菜单前的图标的作用。 /// </summary> [Display(Name = "菜单图标")]
public string MenuIcon { get; set; }
/// <summary>
/// 菜单后面的samall,对应adminlte看,主要为了后期增加个性化菜单使用。
///</summary>
[Display(Name = "小标样式")]
public string MenuSmallCss{ get; set; }
[Display(Name = "小标内容")]
public string MenuSmallValue { get; set; }
public string Code { get; set; } } }
2.再新建一个MenuRole模型,就是角色对应的菜单模型。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;
namespace jsdhh2.Models
{
public class MenuRole
{
[Key]
public int Id { get; set; }
/// <summary>
/// 菜单ID作引
/// </summary>
public string MenuId { get; set; }
/// <summary>
/// 角色名字
/// </summary>
public string RoleName { get; set; }
}
}
在这,我没有象其他人一样使用roleId来,而是直接使用了roleName 字段哩,原因我是新手菜鸟,我好多地方都 引用了roleName的Session,我随时可以用当前RoleName进行与表查询,不用再读Role表了,同时我觉得写的时候 方便。
3.建立上下文。
在DAL文件夹下,新建一个:OaDALContent.cs的上下文
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Web;
using jsdhh2.Models;
namespace jsdhh2.DAL
{
public class OaDALContent : DbContext
{
public OaDALContent() : base("MyOaContent") { }
public DbSet<Menu> Menus { get; set; }
public DbSet<MenuRole> MenuRoles { get; set; }
}
}
然后准备first code了。
先生成一次解决方案。
然后点上面调测按钮。
调测,使用用户名登录,晕,数据库中竟然 没有新增表,看来得先建控制器才能达到FIRTST CODE了。
4.新建一个控制器,我要使用异步的,同时是基架好的,难得麻烦,他会帮我生成我要的编辑呀之类的菜单,直接新建一个Menu控制器。
然后我们再重新生成解决方案
再调测。
登录系统 后,我们再在地址栏中改一下:
http://localhost:55850/Menus/index 回车,强制他访问一下。
然后我们进数据库看一下。
看见了,果然成功first code,我们会发现Menus视图下,自动生成了详细,编辑,新建,删除等功能,就简单多了,对于新手来说
我们先建一个一级菜单:系统设置。(这是为了SuperAdmin来设计的,主要是实现一些系统 的权限设置)
我们会发现我们新建失败,思考一下,肯定是ID为字符串,要GUID,所以得改一下模型和控制器代码。
我没有用GUID,我是使用将时间设为STRIN,作为主键 的方式。更改后,在Create视图中,删除ID的输入框,控制器代码如下
// POST: Menus/Create
// 为了防止“过多发布”攻击,请启用要绑定到的特定属性,有关
// 详细信息,请参阅 https://go.microsoft.com/fwlink/?LinkId=317598。
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Create([Bind(Include = "ParentId,Name,Url,Order,MenuType,MenuCss,MenuIcon,MenuSmallCss,MenuSmallValue,Code")] Menu menu)
{
DateTime dt = DateTime.Now;
string str = dt.ToString("yyyyMMddHHmmss"); //设置ID的样式。
menu.Id = str; //给模型赋值。
if (ModelState.IsValid)
{
db.Menus.Add(menu);
await db.SaveChangesAsync();
return RedirectToAction("Index");
}
return View(menu);
}
添加测试成功: