篇(14)-Asp.Net Core入门实战-权限管理之角色编辑和赋权(ViewModel-DTO初探 ...

打印 上一主题 下一主题

主题 904|帖子 904|积分 2712

入门实战-权限管理之角色编辑和赋权(ViewModel-DTO初探)
前面几章讲了菜单功能的管理之后,我们再创建一个角色管理的功能,创建过程不再详细介绍,只要按照菜单管理功能的步骤进行创建即可;和前面讲的稍微不同的是,现在多了一个Service层和异步操作,功能处理的代码放在这个层完成,只在Controller中调用即可。
一、再讲角色的操作之前,我们先聊一个概念:ViewModel,或者叫DTO;两个是一个意思,叫法不一样而已。ViewModel是ASP.NET MVC应用中的隐式声明的层,用来维护Model和View之间的数据传递, 因此,ViewModel也简称为数据传输对象或 DTO。
我们举个简单的例子:我先以原来Menu菜单功能中的一个查看菜单明细Details来举例说明。
(1):其View代码(Details.cshtml)如下

(2):其Controller的Details Action代码如下:

(3):其预览效果为:

Controller传递到View视图的数据是item,并还定了一个ViewBag.PageTitle的数据,我想把ViewBag.PageTitle个跟随Model item一并传递到View,而且不用ViewBag的方式,那么我就新建一个ViewModel类型的Model,叫MenuView,它的代码是这样:


在Controller中改如何获取值:

在View中如何显示值:

以上就是一个ViewModel的简单应用例子,很好理解。
二、在接着说角色功能的例子,简单说下过程
1.创建角色数据表ManagerRole;
  1. <strong>CREATE TABLE [dbo].[ManagerRole](
  2. [Id] [int] IDENTITY(1,1) NOT NULL,
  3. [RoleName] [varchar](64) NOT NULL,
  4. [RoleType] [int] NOT NULL,
  5. [IsSystem] [bit] NOT NULL,
  6. [AddManagerId] [int] NOT NULL,
  7. [AddTime] [datetime] NOT NULL,
  8. [ModifyManagerId] [int] NULL,
  9. [ModifyTime] [datetime] NULL,
  10. [IsDelete] [bit] NOT NULL,
  11. [Remark] [varchar](128) NULL,
  12. CONSTRAINT [PK_MANAGERROLE] PRIMARY KEY NONCLUSTERED
  13. (
  14. [Id] ASC
  15. )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
  16. ) ON [PRIMARY]
  17. GO</strong>
复制代码
 
2.编写角色Model,ManagerRole;
  1. public class ManagerRole
  2. {
  3. /// <summary>
  4. /// 主键
  5. /// </summary>
  6. [Key]
  7. public int Id { get; set; }
  8. /// <summary>
  9. /// 角色名称
  10. /// </summary>
  11. [Required]
  12. public String RoleName { get; set; }
  13. /// <summary>
  14. /// 角色类型1超管2系管
  15. /// </summary>
  16. [Required]
  17. public int RoleType { get; set; }
  18. /// <summary>
  19. /// 是否系统默认
  20. /// </summary>
  21. [Required]
  22. public Boolean IsSystem { get; set; }
  23. /// <summary>
  24. /// 添加人
  25. /// </summary>
  26. public int AddManagerId { get; set; }
  27. /// <summary>
  28. /// 添加时间
  29. /// </summary>
  30. public DateTime AddTime { get; set; }
  31. /// <summary>
  32. /// 修改人
  33. /// </summary>
  34. public int? ModifyManagerId { get; set; }
  35. /// <summary>
  36. /// 修改时间
  37. /// </summary>
  38. public DateTime? ModifyTime { get; set; }
  39. /// <summary>
  40. /// 是否删除
  41. /// </summary>
  42. public Boolean IsDelete { get; set; }
  43. /// <summary>
  44. /// 备注
  45. /// </summary>
  46. public String Remark { get; set; }
复制代码
 
3.编写角色Controller[ManagerRoleController.cs]和View;

(3.1)Index.cshtml的View视图代码
  1. @using RjWebCms.Db;
  2. @model PaginatedList<ManagerRole>
  3. @{
  4. ViewData["Title"] = "角色列表";
  5. }
  6. @section Scripts{
  7. }
  8. @ViewData["Title"]
  9. @Html.AntiForgeryToken()
  10. <form asp-action="Index" method="get">
  11. <table>
  12. <tr><td><a asp-controller="ManagerRole" asp-action="Create">添加</a></td></tr>
  13. <tr>
  14. <td>查询关键词:<input type="text" name="SearchString" value="@ViewData["CurrentFilter"]" /></td>
  15. <td><input type="submit" value="查询" /></td>
  16. <td><a asp-action="Index">Back</a></td>
  17. <td><a id="DelAll" name="DelAll">批量删除</a></td>
  18. </tr>
  19. </table>
  20. </form>
  21. <table class="table table-hover">
  22. <thead>
  23. <tr>
  24. <td>✔</td>
  25. <td><a asp-action="Index" asp-route-sortOrder="@ViewData["NameSortParm"]" asp-route-currentFilter="@ViewData["CurrentFilter"]">角色名称</a></td>
  26. <td>角色类型</td>
  27. <td><a asp-action="Index" asp-route-sortOrder="@ViewData["DateSortParm"]" asp-route-currentFilter="@ViewData["CurrentFilter"]">时间</a></td>
  28. <td>操作</td>
  29. </tr>
  30. @foreach (var item in Model)
  31. {
  32. <tr>
  33. <td><input type="checkbox" class="done-checkbox" name="chk_ids" value="@item.Id"></td>
  34. <td>@item.RoleName</td>
  35. <td>@item.RoleType</td>
  36. <td>@item.AddTime</td>
  37. <td>
  38. <a asp-controller="ManagerRole" asp-action="Details" asp-route-id="@item.Id">View</a>
  39. <a asp-action="Edit" asp-route-id="@item.Id">Edit</a>
  40. <a asp-controller="RolePermission" asp-action="Index" asp-route-id="@item.Id">Menu</a>
  41. <a asp-controller="ManagerRole" asp-action="Delete" asp-route-id="@item.Id">Delete</a>
  42. </td>
  43. </tr>
  44. }
  45. </thead>
  46. </table>
  47. @{
  48. var prevDisabled = !Model.HasPreviousPage ? "disabled" : "";
  49. var nextDisabled = !Model.HasNextPage ? "disabled" : ""; ;
  50. }
  51. <a asp-action="Index"
  52. asp-route-sortOrder="@ViewData["CurrentSort"]"
  53. asp-route-pageNumber="@(Model.PageIndex - 1)"
  54. asp-route-currentFilter="@ViewData["CurrentFilter"]"
  55. class="btn btn-default @prevDisabled">
  56. 上一页
  57. </a>
  58. <a asp-action="Index"
  59. asp-route-sortOrder="@ViewData["CurrentSort"]"
  60. asp-route-pageNumber="@(Model.PageIndex + 1)"
  61. asp-route-currentFilter="@ViewData["CurrentFilter"]"
  62. class="btn btn-default @nextDisabled">
  63. 下一页
  64. </a>
复制代码
 
(3.2)Create.cshtml视图代码
  1. @{ ViewData["Title"] = "新建角色"; }
  2. @model ManagerRole
  3. <form action="/ManagerRole/Create" method="post">
  4. @Html.AntiForgeryToken()
  5. <label asp-for="RoleName">角色名称</label>
  6. <input type="text" asp-for="RoleName" name="RoleName" placeholder="请输入角色名称">
  7. <label asp-for="RoleType">角色类型</label>
  8. <select name="RoleType" class="RoleType">
  9. <option value="1">超级管理员</option>
  10. <option value="2" selected>系统管理员</option>
  11. </select>
  12. <label asp-for="IsSystem">系统默认</label>
  13. <select asp-for="IsSystem" name="IsSystem" class="IsSystem">
  14. <option value="False" selected>否</option>
  15. <option value="True">是</option>
  16. </select>
  17. <label asp-for="Remark">备注</label>
  18. <textarea placeholder="请输入备注信息" asp-for="Remark" name="Remark"></textarea>
  19. <button type="submit">确定</button>
  20. <button type="reset">重置</button>
  21. </form>
复制代码
 
(3.3)Edit.cshtml视图代码
  1. @{ ViewData["Title"] = "角色编辑"; }
  2. @model ManagerRole
  3. <form action="/ManagerRole/Edit" method="post">
  4. @Html.AntiForgeryToken()
  5. <input type="hidden" asp-for="Id" />
  6. <label asp-for="RoleName">角色名称</label>
  7. <input type="text" asp-for="RoleName" name="RoleName" class="layui-input RoleName" lay-verify="required" placeholder="请输入角色名称">
  8. <label asp-for="RoleType">角色类型</label>
  9. <select name="RoleType" class="RoleType">
  10. <option value="1" selected="@(Model.RoleType == 1 ? " selected" : null)">超级管理员</option>
  11. <option value="2" selected="@(Model.RoleType == 2 ? " selected" : null)">系统管理员</option>
  12. </select>
  13. <label asp-for="IsSystem">系统默认</label>
  14. <select asp-for="IsSystem" name="IsSystem" class="IsSystem">
  15. <option value="false" selected="@(Model.IsSystem==false ? " selected" : null)">否</option>
  16. <option value="true" selected="@(Model.IsSystem==true ? " selected" : null)">是</option>
  17. </select>
  18. <label asp-for="Remark">备注</label>
  19. <textarea placeholder="请输入备注信息" asp-for="Remark" name="Remark" class="layui-textarea Remark"></textarea>
  20. <button type="submit">确定</button>
  21. <button type="reset">重置</button>
  22. </form>
复制代码
 
(3.4)ManagerController.cs控制器代码如下,注意各个Action的类型声明,在Index这个Action上,我加了个[Authorize]声明,意思是,如果你要查看角色,必须是登录用户才行。
  1. public class ManagerRoleController : Controller
  2. {
  3. private readonly IManagerRoleService _roleService;
  4. private readonly AppDbContext _appDbContext;
  5. public ManagerRoleController(IManagerRoleService roleService, AppDbContext appDbContext)
  6. {
  7. _roleService = roleService;
  8. _appDbContext = appDbContext;
  9. }
  10. [Authorize]
  11. public async Task<IActionResult> Index(string sortOrder,string currentFilter,string searchString,int? pageNumber)
  12. {
  13. ViewData["CurrentSort"] = sortOrder;
  14. ViewData["NameSortParm"] = String.IsNullOrEmpty(sortOrder) ? "name_desc" : "";
  15. ViewData["DateSortParm"] = sortOrder == "Date" ? "date_desc" : "Date";
  16. if (searchString != null)
  17. {
  18. pageNumber = 1;
  19. }
  20. else
  21. {
  22. searchString = currentFilter;
  23. }
  24. ViewData["CurrentFilter"] = searchString;
  25. var mRoles = from s in _appDbContext.ManagerRole
  26. select s;
  27. if (!string.IsNullOrEmpty(searchString))
  28. {
  29. mRoles = mRoles.Where(s => s.RoleName.Contains(searchString));
  30. }
  31. switch (sortOrder)
  32. {
  33. case "name_desc":
  34. mRoles = mRoles.OrderByDescending(s => s.RoleName);
  35. break;
  36. case "Date":
  37. mRoles = mRoles.OrderBy(s => s.AddTime);
  38. break;
  39. case "date_desc":
  40. mRoles = mRoles.OrderByDescending(s => s.AddTime);
  41. break;
  42. default:
  43. mRoles = mRoles.OrderBy(s => s.RoleName);
  44. break;
  45. }
  46. int pageSize = 4;
  47. return View(await PaginatedList<ManagerRole>.CreateAsync(mRoles.AsNoTracking(), pageNumber ?? 1, pageSize));
  48. }
  49. [HttpGet]
  50. public IActionResult Create()
  51. {
  52. return View();
  53. }
  54. [HttpPost]
  55. [ValidateAntiForgeryToken]
  56. public async Task<IActionResult> Create(ManagerRole mRole)
  57. {
  58. //去掉对字段IsSystem的验证,IsSystem在数据库是bool类型,而前端是0和1,ModelState的验证总是报false,所以去掉对其验证
  59. //ModelState.Remove("IsSystem");//在View端已经解决了了bool类型,那么此行代码可以不用
  60. if (ModelState.IsValid)
  61. {
  62. var successful = await _roleService.AddManagerRoleAysnc(mRole);
  63. if (successful)
  64. return RedirectToAction("RoleList");
  65. else
  66. return BadRequest("失败");
  67. }
  68. return View(mRole);
  69. }
  70. [HttpGet]
  71. public async Task<IActionResult> Edit(int id)
  72. {
  73. if (string.IsNullOrEmpty(id.ToString()))
  74. return NotFound();
  75. var mRole = await _roleService.FindManagerRoleAsync(id);
  76. if (mRole == null)
  77. return NotFound();
  78. return View(mRole);
  79. }
  80. [HttpPost]
  81. [ValidateAntiForgeryToken]
  82. public async Task<IActionResult> Edit(int id,ManagerRole mRole)
  83. {
  84. if (id != mRole.Id)
  85. {
  86. return NotFound();
  87. }
  88. if (ModelState.IsValid)
  89. {
  90. try
  91. {
  92. var result = await _roleService.UpdateManagerRoleAsync(id,mRole);
  93. }
  94. catch (Exception ex)
  95. {
  96. return BadRequest("编辑失败");
  97. }
  98. return RedirectToAction("Index");
  99. }
  100. return View(mRole);
  101. }
  102. [HttpGet]
  103. public async Task<IActionResult> Delete(int id)
  104. {
  105. var result = await _roleService.DeleteManagerRoleAsync(id);
  106. if (result)
  107. return RedirectToAction("Index");
  108. else
  109. return BadRequest("删除失败");
  110. }
  111. [HttpPost]
  112. [ValidateAntiForgeryToken]
  113. public async Task<IActionResult> DeleteAll(string idString)
  114. {
  115. int countSuccessDel = 0;//记录删除成功的数据条数
  116. int countFailedDel = 0;//记录删除成功的数据条数
  117. if (idString.Length > 0)
  118. {
  119. if (idString.IndexOf(',') > 0)
  120. {
  121. string[] ids = idString.Split(',');
  122. foreach (string id in ids)
  123. {
  124. var result = await _roleService.DeleteManagerRoleAsync(int.Parse(id));
  125. if(result)
  126. countSuccessDel++;
  127. else
  128. countFailedDel++;
  129. }
  130. if (countSuccessDel > 0)
  131. return RedirectToAction("Index");
  132. else
  133. return BadRequest("删除失败");
  134. }
  135. }
  136. return BadRequest("失败");
  137. }
  138. [HttpGet]
  139. public async Task<IActionResult> Details(int id)
  140. {
  141. if (string.IsNullOrEmpty(id.ToString()))
  142. return NotFound();
  143. var mRole = await _roleService.FindManagerRoleAsync(id);
  144. if (mRole == null)
  145. return NotFound();
  146. return View(mRole);
  147. }
  148. }
复制代码
 
(3.5)给角色赋权菜单
在列表页,也就是Index的Action内对其进行分页和添加相关的增、删、改、查的按钮,列表页多一个设置菜单的按钮(Menu),点击Menu按钮的目的是为了给这个角色赋予菜单的权限,这是权限管理控制到菜单级别的一种处理方式。

我在菜单列表页(Index.cshtml)中Menu的链接我是这样写的如下图:

链接到新的Controller和对应的Action:RolePermission是表[RolePermission]对应的Controller,它存储了角色Id与菜单Id的关系;

一个角色如何设置和编辑其具有哪些菜单的页面视图如下:

(3.6)上面设置角色菜单的这个页面的View代码如下(从这里开始那么涉及到了ViewModel的功能),可以看@model指令,我引入了一个MenuView,这是一个ViewModel类型,因为需要集合数据,单纯的一个Menu无法满足我的数据显示和操作,看完View代码,请注意对应的Controller代码:
  1. @model MenuView
  2. @{
  3. ViewData["Title"] = "设置角色的权限菜单";
  4. }
  5. @section Scripts{
  6. }
  7. @ViewData["Title"]
  8. @Html.AntiForgeryToken()
  9. 当前角色:<label id="lab_rolename">@ViewData["roleName"]</label>
  10. <button type="button" id="btnSave">保存</button>
  11. <input type="hidden" id="hidden_roleid" value="@ViewData["roleId"]"/>
  12. <table class="table table-hover">
  13. <thead>
  14. <tr>
  15. <td>系统类别</td>
  16. <td>菜单名称</td>
  17. </tr>
  18. @foreach (var item in Model.MenuList)
  19. {
  20. if (item.ParentId == 0)
  21. {
  22. <tr>
  23. <td>
  24. <input type="checkbox" name="Cbox_H" value="@item.Id"
  25. @(Html.Raw(Model.MenuIds.Contains(item.Id)? "checked="checked"" : "")) />
  26. @item.DisplayName
  27.  
  28. </td>
  29. <td> </td>
  30. </tr>
  31. }
  32. else
  33. {
  34. <tr>
  35. <td> </td>
  36. <td>
  37. <input type="checkbox" name="Cbox_H" value="@item.Id"
  38. @(Html.Raw(Model.MenuIds.Contains(item.Id) ? "checked="checked"" : "")) />
  39. @item.DisplayName
  40. </td>
  41. </tr>
  42. }
  43. }
  44. </thead>
  45. </table>
复制代码
 
这里着重理解一下代码:
就是复选框赋值问题:通过三元运算,判断当前RoleId下有这个MenuId,则选中复选框,没有这个MenuId,就置空。
简单说下处理逻辑:
(1).视图页面将列出所有菜单名称(带复选框);点开本页就只有一种操作-编辑;
(2).编辑时,需要先将原有选择保存过的显示勾选上,然后可再勾选编辑保存;
 
(3.7)权限勾选菜单设置的Controller操作代码,
3.7.1 先看MenuView代码

3.7.2再看RolePermissionController.cs的代码
  1. public class RolePermissionController : Controller
  2. {
  3. private readonly IRolePermissionService _rolePermissionService;
  4. private readonly IManagerRoleService _managerRoleService;
  5. private readonly IMenuService _menuService;
  6. private readonly AppDbContext _appDbContext;
  7. public RolePermissionController(IRolePermissionService rolePermissionService, IManagerRoleService managerRoleService,IMenuService menService,AppDbContext appDbContext)
  8. {
  9. _rolePermissionService = rolePermissionService;
  10. _managerRoleService = managerRoleService;
  11. _menuService = menService;
  12. _appDbContext = appDbContext;
  13. }
  14. public async Task<IActionResult> IndexAsync(int id)
  15. {
  16. ViewData["roleId"] = id;
  17. var ManagerRole = await _managerRoleService.FindManagerRoleAsync(id);
  18. if (ManagerRole != null)
  19. ViewData["roleName"] = ManagerRole.RoleName;
  20. else
  21. ViewData["roleName"] = "未知角色";
  22. #region 查出已经分派权限的roleId 对应的MenuId 参数id=角色id
  23. List<int> menuIds = new List<int>();
  24. menuIds.Add(-1);
  25. if (!string.IsNullOrEmpty(id.ToString()))
  26. {
  27. var rolepermissions = await _rolePermissionService.GetRolePermissionAsync(id);
  28. foreach (RolePermission rp in rolepermissions)
  29. {
  30. menuIds.Add(rp.MenuId);
  31. }
  32. }
  33. #endregion
  34. #region 绑定前台CheckBox
  35. var items = await _menuService.GetMenusByParentId(0);
  36. List<Menu> lists = new List<Menu>();
  37. List<RolePermission> listRolePermission = new List<RolePermission>();
  38. foreach (Menu m in items)
  39. {
  40. lists.Add(m);
  41. var items2 = await _menuService.GetMenusByParentId(m.Id);
  42. foreach (Menu mu in items2)
  43. {
  44. lists.Add(mu);
  45. }
  46. }
  47. var model = new MenuView()
  48. {
  49. MenuList = lists,
  50. MenuIds = menuIds
  51. };
  52. return View(model);
  53. #endregion
  54. }
  55. public async Task<IActionResult> EditAsync(int roleid,string idString)
  56. {
  57. string Msg = "保存成功";
  58. #region 先删除旧的
  59. await _rolePermissionService.DeleteRolePermissionByRoleId(roleid);
  60. #endregion
  61. #region 再添加新的
  62. if (idString.Length > 0)
  63. {
  64. if (idString.IndexOf(',') > 0)
  65. {
  66. string[] ids = idString.Split(',');
  67. List<RolePermission> rps = new List<RolePermission>();
  68. foreach (string id in ids)
  69. {
  70. RolePermission rp = new RolePermission();
  71. rp.RoleId = roleid;
  72. rp.MenuId = int.Parse(id);
  73. rps.Add(rp);
  74. }
  75. await _rolePermissionService.AddRolePermissionAsync(rps);
  76. }
  77. }
  78. #endregion
  79. return View(Msg);
  80. }
  81. }
复制代码
 
代码折叠起来读,就很好理解了。关于return View(Msg),这是个简单处理,以后将统一返回Json或标准信息时,在详细讲解,你可以做这个Action转向,或Return Ok();
(3.8)其中RolePermission对应的Service代码如下:
  1. public class RolePermissionService : IRolePermissionService
  2. {
  3. private readonly AppDbContext _appDbContext;
  4. public RolePermissionService(AppDbContext appDbContext)
  5. {
  6. _appDbContext = appDbContext;
  7. }
  8. public async Task<bool> AddRolePermissionAsync(RolePermission rolePermission)
  9. {
  10. await _appDbContext.RolePermission.AddAsync(rolePermission);
  11. var result = await _appDbContext.SaveChangesAsync();
  12. return result == 1;
  13. }
  14. public async Task<bool> AddRolePermissionAsync(List<RolePermission> rps)
  15. {
  16. await _appDbContext.RolePermission.AddRangeAsync(rps);
  17. var result = await _appDbContext.SaveChangesAsync();
  18. return result == 1;
  19. }
  20. public async Task<bool> DeleteRolePermissionAsync(int Id)
  21. {
  22. var delRolePermission = await _appDbContext.RolePermission.FirstOrDefaultAsync(x => x.Id == Id);
  23. if (delRolePermission != null)
  24. {
  25. _appDbContext.RolePermission.Remove(delRolePermission);
  26. }
  27. var result = await _appDbContext.SaveChangesAsync();
  28. return result == 1; //注意(result==1 如果等式成立,则返回true,说明删除成功)
  29. }
  30. public async Task<bool> DeleteRolePermissionByRoleId(int roleId)
  31. {
  32. List<RolePermission> delRolePermissions = await _appDbContext.RolePermission.Where(x => x.RoleId == roleId).ToListAsync();
  33. if (delRolePermissions != null)
  34. {
  35. foreach(RolePermission rp in delRolePermissions)
  36. _appDbContext.RolePermission.Remove(rp);
  37. }
  38. var result = await _appDbContext.SaveChangesAsync();
  39. return result == 1; //注意(result==1 如果等式成立,则返回true,说明删除成功)
  40. }
  41. /// <summary>
  42. /// 查看一个角色与菜单ID对应关系
  43. /// </summary>
  44. /// <param name="Id"></param>
  45. /// <returns></returns>
  46. public async Task<RolePermission> FindRolePermissionAsync(int Id)
  47. {
  48. var item = await _appDbContext.RolePermission.Where(x => x.Id == Id).FirstOrDefaultAsync();
  49. return item;
  50. }
  51. /// <summary>
  52. /// 获取所有角色和菜单
  53. /// </summary>
  54. /// <returns></returns>
  55. public async Task<RolePermission[]> GetRolePermissionAsync()
  56. {
  57. var items = await _appDbContext.RolePermission.ToArrayAsync();
  58. return items;
  59. }
  60. /// <summary>
  61. /// 获取一个角色的所有菜单
  62. /// </summary>
  63. /// <param name="roleId"></param>
  64. /// <returns></returns>
  65. public async Task<RolePermission[]> GetRolePermissionAsync(int roleId)
  66. {
  67. var items = await _appDbContext.RolePermission.Where(x => x.RoleId == roleId).ToArrayAsync();
  68. return items;
  69. }
  70. /// <summary>
  71. /// 更新角色权限
  72. /// </summary>
  73. /// <param name="id"></param>
  74. /// <param name="rolePermission"></param>
  75. /// <returns></returns>
  76. public async Task<bool> UpdateRolePermissionAsync(int id, RolePermission rolePermission)
  77. {
  78. var oldRolePermission = await FindRolePermissionAsync(id); //找出旧对象
  79. //将新值赋到旧对象上
  80. oldRolePermission.MenuId = rolePermission.MenuId;
  81. oldRolePermission.RoleId = rolePermission.RoleId;
  82. oldRolePermission.Permission = rolePermission.Permission;
  83. //对旧对象执行更新
  84. _appDbContext.Entry(oldRolePermission).State = EntityState.Modified;
  85. var result = await _appDbContext.SaveChangesAsync();
  86. return result == 1;
  87. }
  88. }
复制代码
 
注意有批量添加的功能,读代码时可稍加留意。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

络腮胡菲菲

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表