asp.net Identity2 角色(Role)的使用(二)角色管理,角色控制器和视图
新建一个AdminViewModel 文件,建立视图模型类
public class RoleViewModel
    {
        public string Id { get; set; }
[Required(AllowEmptyStrings=false)]
        [Display(Name="角色名称")]
        public string Name { get; set; }
[Display(Name="角色描述")]
        [StringLength(50,ErrorMessage="{0}不能超过50个字符")]
        [DataType(DataType.MultilineText)]
        public string Description { get; set; }
    }
新建一个角色控制器RoleAdminController,并初始化UserManager值。
public class RoleAdminController : Controller
    {
        public RoleAdminController()
        { }
//构造函数注入;
        public RoleAdminController(ApplicationUserManager userManager, ApplicationRoleManager roleManager)
        {
            UserManager = userManager;
            RoleManager = roleManager;
        }
//定义字段
        private ApplicationUserManager _userManager;
public ApplicationUserManager UserManager
        {
            get 
            {
                return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();//Microsoft.AspNet.Identity.Owin 命名空间下。 空值合并运算符。
            }
            set
            {
                _userManager = value;
            }
        }
private ApplicationRoleManager _roleManager;
public ApplicationRoleManager RoleManager
        {
            get
            {
                return _roleManager ?? HttpContext.GetOwinContext().Get<ApplicationRoleManager>();
            }
            set
            {
                _roleManager = value;
            }
        }
角色列表 要想在角色首页中列表每个角色的用户
模型:
public class IndexRoleViewModel
{
public string Id { get; set; }
[Required(AllowEmptyStrings = false)]
[Display(Name = "角色名称")]
public string Name { get; set; }
[Display(Name = "角色描述")]
[StringLength(50, ErrorMessage = "{0}不能超过50个字符")]
[DataType(DataType.MultilineText)]
public string Description { get; set; }
public List<ApplicationUser> ApplicationUsers { get; set; }
}
}
控制器
        // GET: Admin/RoleAdmin
        public async Task<ActionResult> Index()
        {
            var rolesList =new List<IndexRoleViewModel>();
            foreach (var role in await RoleManager.Roles.ToListAsync())
            {
                var _IndexRoleViewModel = new IndexRoleViewModel()
                {
                    Id = role.Id,
                    Name = role.Name,
                    Description = role.Description,
                    ApplicationUsers =new List<ApplicationUser>()  //特别注意,初始化一个空的List泛型集合。如果不初始化,将为触发一个引用为Null的异常。
                };
foreach (var user in await UserManager.Users.ToListAsync())
                {
                    if (UserManager.IsInRole(user.Id,role.Name))  //遍历用户,如果该用户有此角色,就将此用户加入到集合中。
                    {
                        _IndexRoleViewModel.ApplicationUsers.Add(user);
                    }
                }
rolesList.Add(_IndexRoleViewModel); //最后将此ViewModel 加入到列表中,返回给视图。
            }
return View(rolesList.ToList()); //异步方法在 System.Data.Entity命名空间下面。
        }
视图:
@model IEnumerable<MajorConstruction.Areas.Admin.Models.IndexRoleViewModel>
@{
    ViewBag.Title = "角色列表";
}
<h2>@ViewBag.Title</h2>
<hr />
<table class="table table-striped table-hover">
    <thead>
        <tr>
            <th>
                @Html.DisplayName("角色名称")
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Description)
            </th>
            <th>@Html.DisplayName("拥有此角色的成员")</th>
            <th></th>
        </tr>
    </thead>
    <tbody>
        @foreach (var item in Model)
        {
            <tr>
                <td>
                    @Html.DisplayFor(modelItem => item.Name)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.Description)
                </td>
                <td>
                   <ol>
                        @foreach (var userForRole in item.ApplicationUsers)
                        { 
                            <li>@userForRole.UserName | @userForRole.RealName</li>
                        }
                  </ol>
                </td>
                <td>
                    @Html.ActionLink("编辑", "Edit", new { id = item.Id }) |
                    @Html.ActionLink("详细", "Details", new { id = item.Id }) 
                </td>
            </tr>
        }
    </tbody>
</table>
角色详细信息
控制器:
// GET: Admin/RoleAdmin/Details/5
        public async Task<ActionResult> Details(string id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
var role = await RoleManager.FindByIdAsync(id);
            if (role == null)
            {
                return HttpNotFound();
            }
var users = new List<ApplicationUser>(); //首先要定义一个List泛型容器,用来存放User。
            foreach (var user in UserManager.Users.ToList())
            {
                if(await UserManager.IsInRoleAsync(user.Id,role.Name))
                {
                    users.Add(user);
                }
}
            ViewBag.Users = users;  //如果只是一个集合,可以不使用ViewModel ,而是使用ViewBag动态对象,将数据带入View中。
            ViewBag.UserCount = users.Count();
            return View(role);
        }
视图:
@model MajorConstruction.Areas.Admin.Models.ApplicationRole
@{
    ViewBag.Title = "角色详细信息";
}
<h2>@ViewBag.Title</h2>
<hr />
<div>
    <dl class="dl-horizontal">
        <dt>
            角色名称
        </dt>
<dd>
            @Html.DisplayFor(model => model.Name)
        </dd>
<dt>
            @Html.DisplayNameFor(model => model.Description)
        </dt>
<dd>
            @Html.DisplayFor(model => model.Description)
        </dd>
</dl>
</div>
<h4>拥有此角色的所有成员</h4>
@if (ViewBag.UserCount == 0)
{
    <hr />
    <p>没有用户拥有此角色</p> 
}
<table class="table table-striped table-hover">
    <tr>
        <th>用户名</th>
        <th>姓名</th>
        <th>性别</th>
        <th>邮箱</th>
    </tr>
    @foreach (var item in ViewBag.Users )
    {
        <tr>
            <td>@item.UserName</td>
            <td>@item.RealName</td>
            <td>@item.Gender</td>
            <td>@item.Email</td>
        </tr> 
    }
</table>
<p>
    @Html.ActionLink("编辑", "Edit", new { id = Model.Id }) |
    @Html.ActionLink("返回角色列表", "Index")
</p>
编辑角色: 可以使用T4模板快速生成,没有特别的地方。
控制器:
public async Task<ActionResult> Edit(string id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            var role = await RoleManager.FindByIdAsync(id);
            if (role == null)
            {
                return HttpNotFound();
            }
RoleViewModel roleViewModel = new RoleViewModel { Id = role.Id, Name = role.Name, Description = role.Description };
            return View(roleViewModel);
        }
[HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<ActionResult> Edit([Bind(Include = "Id,Name,Description")] RoleViewModel roleModel)
        {
            if (ModelState.IsValid)
            {
                var role = await RoleManager.FindByIdAsync(roleModel.Id);
                role.Name = roleModel.Name;
                role.Description = roleModel.Description;
                await RoleManager.UpdateAsync(role);
                return RedirectToAction("Index");
            }
            return View(roleModel);
        }
视图:
@model MajorConstruction.Areas.Admin.Models.RoleViewModel
@{
    ViewBag.Title = "编辑角色";
}
<h2>@ViewBag.Title</h2>
<hr />
@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()
<div class="form-horizontal">
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })
        @Html.HiddenFor(model => model.Id)
        @Html.HiddenFor(model =>model.Name)
<div class="form-group">
            @Html.LabelFor(model => model.Name, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                <p class="form-control-static">@Html.DisplayFor(model =>model.Name)</p>
            </div>
        </div>
<div class="form-group">
            @Html.LabelFor(model => model.Description, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.Description, new { htmlAttributes = new { @class = "form-control",rows="5" } })
                @Html.ValidationMessageFor(model => model.Description, "", new { @class = "text-danger", })
            </div>
        </div>
<div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="保存" class="btn btn-default" />
            </div>
        </div>
    </div>
}
<div>
    @Html.ActionLink("返回角色列表", "Index")
</div>
@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}
删除角色和新建角色 和Vs 自动生成的没有两样,在一般的后台控制管理系统中,权限角色的授权都是写死在程序中,所以没有必要提供新建角色和删除角色的功能,只需要在角色初始化器中初始化就可以了。
但是,如果是在动态分配角色权限,比如某个角色对某个操作有查看的权限,就需要有增和删的功能了。
asp.net Identity2 角色(Role)的使用(二)角色管理,角色控制器和视图的更多相关文章
- Laravel 5 基础(二)- 路由、控制器和视图简介
		查看 app/Http/routes.php Route::get('/', 'WelcomeController@index'); @是一个界定符,前面是控制器,后面是动作,表示当用户请求url / ... 
- asp.net -mvc框架复习(9)-实现用户登录控制器和视图的编写并调试
		1.编写控制器 三个步骤: [1]获取数据 [2]业务处理 [3]返回数据 using System;using System.Collections.Generic;using System.Lin ... 
- (9)ASP.NET Core 中的MVC路由二
		1.URL生成 MVC应用程序可以使用路由的URL生成功能,生成指向操作(Action)的URL链接. IUrlHelper 接口用于生成URL,是MVC与路由之间的基础部分.在控制器.视图和视图组件 ... 
- asp.net Identity2 角色(Role)的使用(三)用户管理,用户控制器和视图
		修改用户控制器AccountController,增加角色管理器. public class AccountController : Controller { public AccountContro ... 
- asp.net中使用基于角色role的Forms验证
		http://www.cnblogs.com/yao/archive/2006/06/24/434783.html asp.net中使用基于角色role的Forms验证,大致经过几下四步:1.配置系统 ... 
- asp.net identity 2.2.0 在WebForm下的角色启用和基本使用(二)
		管理用户功能: 界面部分: <%@ Page Title="" Language="C#" MasterPageFile="~/Site.mas ... 
- ASP.NET Core 基于JWT的认证(二)
		ASP.NET Core 基于JWT的认证(二) 上一节我们对 Jwt 的一些基础知识进行了一个简单的介绍,这一节我们将详细的讲解,本次我们将详细的介绍一下 Jwt在 .Net Core 上的实际运用 ... 
- ASP.NET Core 3.0 一个 jwt 的轻量角色/用户、单个API控制的授权认证库
		目录 说明 一.定义角色.API.用户 二.添加自定义事件 三.注入授权服务和中间件 三.如何设置API的授权 四.添加登录颁发 Token 五.部分说明 六.验证 说明 ASP.NET Core 3 ... 
- Asp.Net MVC+BootStrap+EF6.0实现简单的用户角色权限管理
		这是本人第一次写,写的不好的地方还忘包含.写这个的主要原因是想通过这个来学习下EF的CodeFirst模式,本来也想用AngularJs来玩玩的,但是自己只会普通的绑定,对指令这些不是很熟悉,所以就基 ... 
- 自学Aruba5.1-Aruba 基于角色(role)的策略管理(重点)
		点击返回:自学Aruba之路 自学Aruba5.1-Aruba 基于角色(role)的策略管理(重点) 1. 角色Role介绍 在ArubaOS中,用户(User)指的是已经完成连接,并获取到IP地址 ... 
随机推荐
- 1027  stl
			#include<stdio.h> #include<queue> using namespace std; int main() { int i,n,m,j,k,a[100 ... 
- bzoj1004 [HNOI2008]Cards 置换群+背包
			[bzoj1004][HNOI2008]Cards 2014年5月26日5,3502 Description 小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿 ... 
- mappedBy的作用
			mappedBy的意思就是"被映射",即mappedBy这方不用管关联关系,关联关系交给另一方处理 1.规律:凡是双向关联,mapped必设,因为根本都没必要在2个表中都存在一个外 ... 
- Python()-  面向对象三大特性----封装
			封装: [封装] 隐藏对象的属性和实现细节,仅对外提供公共访问方式.[好处] 1. 将变化隔离: 2. 便于使用:3. 提高复用性: 4. 提高安全性:[封装原则] 1. 将 ... 
- Last Defence - UVA7045
			https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ... 
- [Bzoj3131][Sdoi2013]淘金(数位dp)(优先队列)
			3131: [Sdoi2013]淘金 Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 847 Solved: 423[Submit][Status][ ... 
- Spring MVC中 log4j日志文件配置相对路径
			log4j和web.xml配置webAppRootKey 的问题 1 在web.xml配置 <context-param> <param-name>webAppRootKey ... 
- 关于MySQL的boolean和tinyint(1)
			原文:http://blog.csdn.net/woshixuye/article/details/7089508 MySQL保存boolean值时用1代表TRUE,0代表FALSE.boolean在 ... 
- 了解kaggle
			Kaggle官网 数据挖掘的比赛,主要是特征工程 Kaggle 数据挖掘比赛经验分享 Kaggle 机器学习竞赛冠军及优胜者的源代码汇总 程序化广告交易中的点击率预估 
- Android开发:怎样隐藏自己的app应用
			本文主要介绍怎样通过改动AndroidManifest.xml清单文件来达到隐藏自身应用的目的,不是隐藏第三方应用.为了不浪费大家时间.特此说明. 转载请注明作者xiong_it和链接:http:// ... 
