您现在的位置是:网站首页> .NET Core
Asp.Net Core中的角色
- .NET Core
- 2022-02-05
- 771人已阅读
在前面介绍中我们知道了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 });
}