zoukankan      html  css  js  c++  java
  • Asp.Net Core中的角色

      在前面介绍中我们知道了Asp.Net Core Identity中创建用户使用到的类UserManager<IdentityUser>,同样的,创建角色我们需要使用RoleManager<IdentityRole>。

      接下来我们就来看看如何创建角色。

      先定义ViewModel

    namespace StudentManagement.ViewModels
    {
        public class CreateRoleViewModel
        {
            [Required]
            [Display(Name = "角色")]
            public string RoleName { get; set; }
        }
    }

      创建AdminController

    namespace StudentManagement.Controllers
    {
        public class AdminController : Controller
        {
           private readonly RoleManager<IdentityRole> roleManager;
        private readonly UserManager<ApplicationUser> userManager;
    public AdminController(RoleManager<IdentityRole> roleManager, UserManager<ApplicationUser> userManager) { this.roleManager = roleManager;
           this.userManager = userManager;
    } [HttpGet] public IActionResult CreateRole() { return View(); } [HttpPost] public async Task<IActionResult> CreateRole(CreateRoleViewModel model) { if (ModelState.IsValid) { //我们只需要指定一个不重复的角色名称来创建新角色 IdentityRole identityRole = new IdentityRole { Name = model.RoleName }; //将角色保存在AspNetRoles表中 IdentityResult result = await roleManager.CreateAsync(identityRole); if (result.Succeeded) { return RedirectToAction("ListRoles", "Admin"); } foreach (IdentityError error in result.Errors) { ModelState.AddModelError("", error.Description); } } return View(model); } }

      创建视图

    @model  CreateRoleViewModel
    
    @{
        ViewBag.Title = "创建新角色";
    }
    
    <form asp-action="CreateRole" method="post" class="mt-3">
        <div asp-validation-summary="All" class="text-danger">
        </div>
        <div class="form-group row">
            <label asp-for="RoleName" class="col-sm-2 col-form-label"></label>
            <div class="col-sm-10">
                <input asp-for="RoleName" class="form-control" placeholder="Name">
                <span asp-validation-for="RoleName" class="text-danger"></span>
            </div>
        </div>
    
        <div class="form-group row">
            <div class="col-sm-10">
                <button type="submit" class="btn btn-primary" style="auto">
                   创建角色
                </button>
            </div>
        </div>
    </form>

      创建完角色,我们需要显示它,在AdminController中添加下面的ListRoles方法

    [HttpGet]
    public IActionResult ListRoles()
    {
        var roles = roleManager.Roles;
        return View(roles);
    }

      新建ListRoles视图,既然有列表,那么就应该存在编辑和删除角色的功能

    @model IEnumerable<IdentityRole>
    
    @{
        ViewBag.Title = "角色列表";
    }
    
    <h1>所有角色列表</h1>
    
    @if (Model.Any())
    {
        <a class="btn btn-primary mb-3" style="auto" asp-action="CreateRole"
           asp-controller="admin">添加新角色</a>
    
        foreach (var role in Model)
        {
            <div class="card mb-3">
                <div class="card-header">
                    角色Id : @role.Id
                </div>
                <div class="card-body">
                    <h5 class="card-title">@role.Name</h5>
                </div>
                <div class="card-footer">
    
                    <form method="post" asp-action="DeleteUser" asp-route-id="@role.Id">
                        <a asp-controller="Admin" asp-action="EditRole"
                           asp-route-id="@role.Id" class="btn btn-primary">
                            编辑
                        </a>
    
                        <span id="confirmDeleteSpan_@role.Id" style="display:none">
                            <span>你确定你要删除?</span>
                            <button type="submit" class="btn btn-danger">是</button>
                            <a href="#" class="btn btn-primary"
                               onclick="confirmDelete('@role.Id', false)">否</a>
                        </span>
    
                        <span id="deleteSpan_@role.Id">
                            <a href="#" class="btn btn-danger"
                               onclick="confirmDelete('@role.Id', true)">删除</a>
                        </span>
                    </form>
    
    
                </div>
            </div>
        }
    }
    else
    {
        <div class="card">
            <div class="card-header">
                尚未创建任何角色
            </div>
            <div class="card-body">
                <h5 class="card-title">
                    点击下面的按钮创建角色
                </h5>
                <a class="btn btn-primary" style="auto"
                   asp-controller="admin" asp-action="CreateRole">
                    创建角色
                </a>
            </div>
        </div>
    }
    [HttpPost]
    public async Task<IActionResult> DeleteRole(string id)
    {
        var role = await roleManager.FindByIdAsync(id);
    
        if (role == null)
        {
            ViewBag.ErrorMessage = $"无法找到ID为{id}的角色信息";
            return View("NotFound");
        }
        else
        {
            var result = await roleManager.DeleteAsync(role);
    
            if (result.Succeeded)
            {
                return RedirectToAction("ListRoles");
            }
    
            foreach (var error in result.Errors)
            {
                ModelState.AddModelError("", error.Description);
            }
    
            return View("ListRoles");
        }
    }
    [HttpGet]
    public async Task<IActionResult> EditRole(string id)
    {
        //通过角色ID查找角色
        var role = await roleManager.FindByIdAsync(id);
    
        if (role == null)
        {
            ViewBag.ErrorMessage = $"角色Id={id}的信息不存在,请重试。";
            return View("NotFound");
        }
    
        var model = new EditRoleViewModel
        {
            Id = role.Id,
            RoleName = role.Name
        };
    
        // 查询所有的用户
        foreach (var user in userManager.Users)
        {
            //如果用户拥有此角色,请将用户名添加到
            // EditRoleViewModel模型中的Users属性中
            //然后将对象传递给视图显示到客户端
            if (await userManager.IsInRoleAsync(user, role.Name))
            {
                model.Users.Add(user.UserName);
            }
        }
    
        return View(model);
    }
    
    //此操作方法用于响应HttpPost的请求并接收EditRoleViewModel模型数据
    [HttpPost]
    public async Task<IActionResult> EditRole(EditRoleViewModel model)
    {
        var role = await roleManager.FindByIdAsync(model.Id);
    
        if (role == null)
        {
            ViewBag.ErrorMessage = $"角色Id={model.Id}的信息不存在,请重试。";
            return View("NotFound");
        }
        else
        {
            role.Name = model.RoleName;
    
            //使用UpdateAsync更新角色
            var result = await roleManager.UpdateAsync(role);
    
            if (result.Succeeded)
            {
                return RedirectToAction("ListRoles");
            }
    
            foreach (var error in result.Errors)
            {
                ModelState.AddModelError("", error.Description);
            }
    
            return View(model);
        }
    }

       创建视图

    @model EditRoleViewModel
    
    @{
        ViewBag.Title = "编辑角色";
    }
    
        <h1>编辑角色</h1>
    
    <form method="post" class="mt-3">
        <div class="form-group row">
            <label asp-for="Id" class="col-sm-2 col-form-label"></label>
            <div class="col-sm-10">
                <input asp-for="Id" disabled class="form-control">
            </div>
        </div>
        <div class="form-group row">
            <label asp-for="RoleName" class="col-sm-2 col-form-label"></label>
            <div class="col-sm-10">
                <input asp-for="RoleName" class="form-control">
                <span asp-validation-for="RoleName" class="text-danger"></span>
            </div>
        </div>
    
        <div asp-validation-summary="All" class="text-danger"></div>
    
        <div class="form-group row">
            <div class="col-sm-10">
                <button type="submit" class="btn btn-primary">更新</button>
                <a asp-action="ListRoles" class="btn btn-primary">取消</a>
            </div>
        </div>
    
        <div class="card">
            <div class="card-header">
                <h3>该角色中的用户</h3>
            </div>
            <div class="card-body">
                @if (Model.Users.Any())
                {
                    foreach (var user in Model.Users)
                    {
                        <h5 class="card-title">@user</h5>
                    }
                }
                else
                {
                    <h5 class="card-title">目前没有信息</h5>
                }
            </div>
            <div class="card-footer">
                <a asp-controller="Admin" asp-action="EditUsersInRole"
                   asp-route-roleId="@Model.Id" class="btn btn-primary">
                    添加或删除用户到角色中
                </a>
            </div>
        </div>
    </form>

      有了角色之后,我们需要为角色添加用户,所以先创建 EditRoleViewModel 和 UserRoleViewModel。

    public class EditRoleViewModel
    {
        public EditRoleViewModel()
        {
            Users = new List<string>();
        }
    
        [Display(Name = "角色Id")]
        public string Id { get; set; }
    
        [Required(ErrorMessage = "角色名称是必填的")]
        [Display(Name ="角色名称")]
        public string RoleName { get; set; }
    
        public List<string> Users { get; set; }
    }
    public class UserRoleViewModel
    {
        public string UserId { get; set; }
        public string UserName { get; set; }
        public bool IsSelected { get; set; }
    }
    @model List<UserRoleViewModel>
    
    @{
        var roleId = ViewBag.roleId;
    }
    
    <form method="post">
        <div class="card">
            <div class="card-header">
                <h2>在此角色中添加或删除用户</h2>
            </div>
            <div class="card-body">
                @for (int i = 0; i < Model.Count; i++)
                {
                    <div class="form-check m-1">
                        <input type="hidden" asp-for="@Model[i].UserId" />
                        <input type="hidden" asp-for="@Model[i].UserName" />
                        <input asp-for="@Model[i].IsSelected" class="form-check-input" />
                        <label class="form-check-label" asp-for="@Model[i].IsSelected">
                            @Model[i].UserName
                        </label>
                    </div>
                }
            </div>
            <div class="card-footer">
                <input type="submit" value="更新" class="btn btn-primary"
                       style="auto" />
                <a asp-action="EditRole" asp-route-id="@roleId"
                   class="btn btn-primary" style="auto">取消</a>
            </div>
        </div>
    </form>

      创建控制器的方法

    [HttpGet]
    public async Task<IActionResult> EditUsersInRole(string roleId)
    {
        ViewBag.roleId = roleId;
    
        var role = await roleManager.FindByIdAsync(roleId);
    
        if (role == null)
        {
            ViewBag.ErrorMessage = $"角色Id={roleId}的信息不存在,请重试。";
            return View("NotFound");
        }
    
        var model = new List<UserRoleViewModel>();
    
        foreach (var user in userManager.Users)
        {
            var userRoleViewModel = new UserRoleViewModel
            {
                UserId = user.Id,
                UserName = user.UserName
            };
    
            if (await userManager.IsInRoleAsync(user, role.Name))
            {
                userRoleViewModel.IsSelected = true;
            }
            else
            {
                userRoleViewModel.IsSelected = false;
            }
    
            model.Add(userRoleViewModel);
        }
    
        return View(model);
    }
    
    
    [HttpPost]
    public async Task<IActionResult> EditUsersInRole(List<UserRoleViewModel> model, string roleId)
    {
        var role = await roleManager.FindByIdAsync(roleId);
    
        if (role == null)
        {
            ViewBag.ErrorMessage = $"角色Id={roleId}的信息不存在,请重试。";
            return View("NotFound");
        }
    
        for (int i = 0; i < model.Count; i++)
        {
            var user = await userManager.FindByIdAsync(model[i].UserId);
    
            IdentityResult result = null;
    
            if (model[i].IsSelected && !(await userManager.IsInRoleAsync(user, role.Name)))
            {
                result = await userManager.AddToRoleAsync(user, role.Name);
            }
            else if (!model[i].IsSelected && await userManager.IsInRoleAsync(user, role.Name))
            {
                result = await userManager.RemoveFromRoleAsync(user, role.Name);
            }
            else
            {
                continue;
            }
    
            if (result.Succeeded)
            {
                if (i < (model.Count - 1))
                    continue;
                else
                    return RedirectToAction("EditRole", new { Id = roleId });
            }
        }
    
        return RedirectToAction("EditRole", new { Id = roleId });
    }
  • 相关阅读:
    Netty源码剖析-关闭服务
    Netty源码剖析-断开连接
    Netty源码剖析-发送数据
    Netty源码剖析-业务处理
    Netty源码剖析-接受数据
    Netty源码剖析-构建链接
    html中调用silverlight中的方法
    在Silverlight宿主html页面添加按钮无法显示
    win7旗舰版在安装vs2010后向sql2008添加SQL_Server_Management详解
    javascript arguments
  • 原文地址:https://www.cnblogs.com/jesen1315/p/11562213.html
Copyright © 2011-2022 走看看