如何在ASP.NET Identity下拉列表中排除指定角色的用户
解决方案:过滤下拉列表中的特定角色用户
嘿,这事儿不难,只需要在获取用户列表的时候直接排除掉属于ContactManagers和ContactAdministrators角色的用户就行,不用大改现有逻辑,刚好满足你只隐藏这两类用户的需求。
给你两种可行的实现方式,选哪种看你的偏好:
方法一:通过UserManager获取角色用户后过滤
这种方式用Identity自带的方法,代码更直观,不用额外操作DbContext:
// 先获取需要排除的两个角色下的所有用户 var contactManagers = await UserManager.GetUsersInRoleAsync("ContactManagers"); var contactAdmins = await UserManager.GetUsersInRoleAsync("ContactAdministrators"); // 合并两类用户的ID,避免重复 var excludedUserIds = contactManagers.Select(u => u.Id).Union(contactAdmins.Select(u => u.Id)); // 从所有用户中排除这些目标用户 Users = await UserManager.Users .Where(u => !excludedUserIds.Contains(u.Id)) .ToListAsync();
方法二:直接通过EF关联查询过滤(性能更优)
如果你的项目里可以直接操作DbContext,这种方式只需要一次数据库查询,效率更高:
// 定义要排除的角色名称 var excludedRoles = new[] { "ContactManagers", "ContactAdministrators" }; // 先拿到这两个角色对应的ID var excludedRoleIds = await _context.Roles .Where(r => excludedRoles.Contains(r.Name)) .Select(r => r.Id) .ToListAsync(); // 过滤出不在这些角色关联列表中的用户 Users = await UserManager.Users .Where(u => !_context.UserRoles.Any(ur => ur.UserId == u.Id && excludedRoleIds.Contains(ur.RoleId))) .ToListAsync();
额外说明
- 你的前端下拉列表代码完全不需要修改,因为
Model.Users已经是过滤后的用户集合了,直接沿用原来的配置即可:<select asp-for="Contact.GeneralClientName" class="custom-select mr-sm-2" asp-items="@(new SelectList(Model.Users, "Id", "CompanyName"))"> <option selected="selected" value="0">Please Select</option> </select> - 这两种方式都不需要改动用户角色分配的逻辑,只是在查询用户列表时做了过滤,改动量极小,完美契合你的需求。
内容的提问来源于stack exchange,提问作者Oscar Arango
相关产品推荐
相关产品推荐

