Identity角色管理五(添加用户到角色组)

因需要在用户列表中点详情按钮来到当前页,所以需要展示分组详情,并展示当前所属角色组的用户

 public async Task<ActionResult> Details(string id)
 {
     //查找是否存在角色组
     var role = await _roleManager.FindByIdAsync(id);
     //如果角色不存在跳转回角色列表
     if (role == null)
     {
         return RedirectToAction(nameof(Index));
     }
     //给视图模型赋值
     var roleUserViewModel = new RoleUserViewModel()
     {
         RoleId = role.Id,
         RoleName = role.Name
     };
     //找出所有用户
     var users = await _userManager.Users.AsNoTracking().ToListAsync();
     //循环查找用户是否存在当前角色组
     foreach (var item in users)
     {
         if (await _userManager.IsInRoleAsync(item, role.Name))
         {
             roleUserViewModel.Users.Add(item);
         }
     }
     return View(roleUserViewModel);
 }

详情展示页视图代码如下

@model Shop.ViewModel.RoleUserViewModel

@{
    ViewData["Title"] = "Details";
}

<h1>Details</h1>

<div>
    <h4>CreateRoleViewModel</h4>
    <hr />
    <dl class="row">
        <dt class="col-sm-5">
            @Html.DisplayFor(model => model.RoleId)
        </dt>
        <dd class="col-sm-2">
            @Html.DisplayFor(model => model.RoleName)
        </dd>
    </dl>
    <dl class="row">
        @foreach (var item in Model.Users)
        {
            <dt>@item.UserName</dt>
        }
    </dl>
    <a asp-action="AddUserToRole" asp-route-id="@Model.RoleId" class="btn btn-success">添加用户到角色</a>

</div>
<div>
    @Html.ActionLink("Edit", "Edit", new { /* id = Model.PrimaryKey */ }) |
    <a asp-action="Index">Back to List</a>
</div>

创建UserRoleViewModel模型类

using System.Collections.Generic;
using Microsoft.AspNetCore.Identity;

namespace Shop.ViewModel
{
    public class UserRoleViewModel
    {
        public UserRoleViewModel()
        {
            Users = new List<IdentityUser>();
        }
        public string RoleId { get; set; }
        public string UserId { get; set; }
        public List<IdentityUser> Users { get; set; }
    }
}

在role控制器中创建添加用户到角色组的显示方法

public async Task<ActionResult> AddUserToRole(string id)
{
    //查找是否存在角色
    var role = await _roleManager.FindByIdAsync(id);
    //如果角色不存在跳回角色列表
    if (role == null)
    {
        return RedirectToAction(nameof(Index));
    }
    //将查找的角色ID添加到视图模型
    var userRoleViewModel = new UserRoleViewModel()
    {
        RoleId = role.Id
    };
    //将所有用户找出来
    var users = await _userManager.Users.AsNoTracking().ToListAsync();
    //循环遍历是否用户不在当前角色中、
    foreach (var item in users)
    {
        if (!await _userManager.IsInRoleAsync(item, role.Name))
        {
            userRoleViewModel.Users.Add(item);
        }
    }
    //将视图模型返回
    return View(userRoleViewModel);
}

根据选择添加用户到角色组

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> AddUserToRole(UserRoleViewModel input)
{
    //查找当前用户
    var user = await _userManager.FindByIdAsync(input.UserId);
    //查找当前角色组
    var role = await _roleManager.FindByIdAsync(input.RoleId);
    //角色跟用户都找到
    if (user != null && role != null)
    {
        //用户管理中添加当前用户到角色组(当前用户,角色组名称)
        var result = await _userManager.AddToRoleAsync(user, role.Name);
        if (result.Succeeded)
        {
            return RedirectToAction(nameof(Index));
        }
        //输出所有Model级错误
        foreach (var error in result.Errors)
        {
            ModelState.AddModelError("", error.Description);
        }
    }
    return View(input);
}

页面显示,选择后按添加执行上边方法写入数据库

添加后返回详情页,并显示当前角色组的用户如图所示

添加用户后,再次添加将不再显示在选择框内

删除角色跟添加角色类似,删除代码为_userManager.RemoveFromRoleAsync(user,role.Name)

posted @ 2020-06-30 14:04  liessay  阅读(951)  评论(0编辑  收藏  举报