您现在的位置是:网站首页> .NET Core

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="width: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="width: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="width: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="width:auto" />

            <a asp-action="EditRole" asp-route-id="@roleId"

               class="btn btn-primary" style="width: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 });

}


Top