Asp.Net Core中的角色
2024-09-01 13:39:54
在前面介绍中我们知道了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 = ; 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 = ; 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 - ))
continue;
else
return RedirectToAction("EditRole", new { Id = roleId });
}
} return RedirectToAction("EditRole", new { Id = roleId });
}
最新文章
- 数据的平面拟合 Plane Fitting
- JAVA利用JXL导出/生成 EXCEL
- iOS第三方地图-百度地图定位的封装
- UGUI 锚点
- Visual Studio Tools for Unity安装及使用
- Tickets
- CF 375D. Tree and Queries加强版!!!【dfs序分块 大小分类讨论】
- python dict to dataframe
- 配置nginx反向代理服务器,解决浏览器跨域调用接口的限制问题
- ssh远程登录不上的处理
- linux sendmail 发送缓慢的问题
- Verilog TestBench Coding Style
- python学习之老男孩python全栈第九期_day003作业
- 报错”Cannot read property &#39;addEventListener&#39; of null“
- HDUOJ --2544最短路(基础)
- “全栈2019”Java异常第十四章:将异常输出到文本文件中
- hadoop常见错误解决方法
- WPF性能调试系列 – Ants Performance Profiler
- springMVC怎么改变form的提交方式为put或者delete
- 在go中使用leveldb --levi
热门文章
- /dev/null和/dev/zero的作用
- 2-set 1823: [JSOI2010]满汉全席
- 【IOI2019】2048矩形模拟
- ROS文件系统级
- gcc/g++ 链接库的编译与链接
- 在application-context.xml中配置多个property-placeholder
- Java中使用md5进行hash运算
- Tkinter 之Place布局
- 表单Content-Type为multipart/form-data时,后台数据的接收
- API 设计 POSIX File API