找回密码
 立即注册
问题
我想在我的 ASP.NET MVC 项目中实现动态授权,其中资源权限可以由系统管理员动态分配给用户和角色。我正在使用下表来管理权限。

这些表的模型是
  1. public class Resource
  2. {
  3.     [Key]
  4.     [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
  5.     public int Id { get; set; }
  6.     public int? ParentResourceId { get; set; }
  7.     public string Name { get; set; }
  8.     public string DisplayName { get; set; }
  9.     public int Order { get; set; }
  10.     public Resource ParentResource { get; set; }
  11.     public ICollection<Permission> Permissions { get; set; }
  12. }

  13. public class Permission
  14. {
  15.     [Key]
  16.     [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
  17.     public int Id { get; set; }
  18.     public int ResourceId { get; set; }
  19.     public string Name { get; set; }
  20.     public string DisplayName { get; set; }
  21.     public int Order { get; set; }
  22.     public Resource Resource { get; set; }
  23. }
复制代码

我需要根据树视图等 UI 上的资源层次结构显示资源权限,以便管理员可以检查并向用户和角色分配权限。使用递归函数(如下所示),我可以创建一个资源层次结构(仅从资源表),但不能包含此层次结构的权限。

到目前为止我正在尝试的代码如下:
  1. public List<PermissionTreeDto> GetPermissions()
  2.     {
  3.         var permissions = _context.Resources
  4.                           .Where(r => r.OrganizationId == OrganizationId)
  5.                           .ToList();

  6.         return permissions.Where(r => r.ParentResourceId == null)
  7.                         .OrderBy(r => r.Order)
  8.                         .Select(r => new PermissionTreeDto
  9.                         {
  10.                             id = 0,
  11.                             text = r.DisplayName,
  12.                             @checked = false,
  13.                             children = GetChildren(permissions, r.Id)
  14.                         }).ToList();
  15.     }

  16.     private List<PermissionTreeDto> GetChildren(List<Resource> permissions, int parentId)
  17.     {
  18.         return permissions.Where(r => r.ParentResourceId == parentId)
  19.             .OrderBy(r => r.Order)
  20.             .Select(r => new PermissionTreeDto
  21.             {
  22.                 id = 0,
  23.                 text = r.DisplayName,
  24.                 @checked = false,
  25.                 children = GetChildren(permissions, r.Id)
  26.             }).ToList();
  27.     }
复制代码

我正在使用 gijgo 引导树视图:

我的模型设计也可能有问题。在这种情况下,请提出任何更好的方法来实现我正在寻找的东西。

回答
我以这种方式在获得许可的情况下管理层次结构 -
  1. public List<ResourceTreeDto> GetPermissions()
  2.     {
  3.         var resources = _context.Resources.Include(r=>r.Permissions)
  4.                           .Where(r => r.OrganizationId == OrganizationId)
  5.                           .ToList();

  6.         return resources.Where(r => r.ParentResourceId == null)
  7.                         .OrderBy(r => r.Order)
  8.                         .Select(r => new ResourceTreeDto
  9.                         {
  10.                             id = 0,
  11.                             text = r.DisplayName,
  12.                             @checked = false,
  13.                             children = r.Permissions.OrderBy(p=>p.Order).Select(p => new ResourceTreeDto()
  14.                             {
  15.                                 id = p.Id,
  16.                                 text = p.DisplayName,
  17.                                 @checked = false
  18.                             }).Union(GetChildren(resources, r.Id))
  19.                         }).ToList();
  20.     }

  21. private IEnumerable<ResourceTreeDto> GetChildren(List<Resource> resources, int parentId)
  22.     {
  23.         return resources.Where(r => r.ParentResourceId == parentId)
  24.             .OrderBy(r => r.Order)
  25.             .Select(r => new ResourceTreeDto
  26.             {
  27.                 id = 0,
  28.                 text = r.DisplayName,
  29.                 @checked = false,
  30.                 children = r.Permissions.OrderBy(p => p.Order).Select(p => new ResourceTreeDto()
  31.                 {
  32.                     id = p.Id,
  33.                     text = p.DisplayName,
  34.                     @checked = false
  35.                 }).Union(GetChildren(resources, r.Id))
  36.             });
  37.     }
复制代码

现在我得到了预期的输出 -





上一篇:精简的 Python 生成器,第二更短:如何检索静默使用的元素
下一篇:日期(21-09-1989,DD-MM-YY)和日期(21-09-89,DD-MM-YY)有什么区别?