如何解决UserManager.GetRolesAsync报错并转换结果为List<RoleUserModel>?
问题描述
我需要展示用户的所有已分配角色,用于角色的添加或删除操作。目前页面已实现:
- 将所有用户加载至网格(1)
- 将所有现有角色加载至第二个网格(2)
- 点击用户行触发
private async Task SelectedRow(RowSelectEventArgs args)方法,在网格(3)头部显示用户名
下一步计划实现:选择角色后点击按钮,将角色转移至RoleUserGrid。
现有代码如下:
private List<RoleUserModel>? userRoles = null; [Parameter] public string Selection { get; set; } [Parameter] public string UserId { get; set; }
private async Task SelectedRow(RowSelectEventArgs<UserModel> args) { Selection = args.Data.UserName; UserId = args.Data.Id; var user = await UserManager.FindByNameAsync(Selection); var userId = await UserManager.FindByIdAsync(UserId); userRoles = await UserManager.GetRolesAsync(userId.Id); // 错误CS1503 userRoles = await UserManager.GetRolesAsync(Selection); // 错误CS1503 userRoles = await UserManager.GetRolesAsync(user); // 错误CS1503 IList<string> usrRoles = await UserManager.GetRolesAsync(userId); // 此方法可行,但... // 如何将usrRoles转换为userRoles? }
遇到的问题
- 调用
UserManager.GetRolesAsync时,传入userId.Id(字符串ID)、用户名、user对象均报CS1503错误; - 仅传入
userId(User对象)可获取IList<string>类型的角色列表,但不知道如何将其转换为List<RoleUserModel>类型的userRoles。
解决方案
一、CS1503错误原因
UserManager.GetRolesAsync方法的参数类型是TUser(项目中对应User类实例),而非字符串ID或用户名:
- 传入
userId.Id(字符串)、Selection(用户名)时,类型不匹配直接报错; - 传入
user对象报错,大概率是user为null(比如通过用户名查找失败),或者user的类型和UserManager期望的TUser不一致。
可以先检查user是否存在:
if (user == null) { // 处理用户不存在的场景,比如弹窗提示 return; }
二、将IList转换为List
RoleUserModel是自定义模型类,通常包含角色名称、ID等字段。假设模型有RoleName属性,可通过LINQ完成映射:
首先引入LINQ命名空间:
using System.Linq;
然后修改转换逻辑:
IList<string> usrRoles = await UserManager.GetRolesAsync(userId); // 映射为List<RoleUserModel> userRoles = usrRoles.Select(roleName => new RoleUserModel { RoleName = roleName // 若需要RoleId,需通过RoleManager查询角色详情,示例: // RoleId = await _roleManager.FindByNameAsync(roleName)?.Id }).ToList();
如果需要角色ID,需先注入RoleManager<TRole>:
private readonly RoleManager<IdentityRole> _roleManager; // 构造函数注入RoleManager public YourComponent(RoleManager<IdentityRole> roleManager) { _roleManager = roleManager; } // 转换时获取完整角色信息 userRoles = new List<RoleUserModel>(); foreach (var roleName in usrRoles) { var role = await _roleManager.FindByNameAsync(roleName); if (role != null) { userRoles.Add(new RoleUserModel { RoleId = role.Id, RoleName = role.Name }); } }
内容的提问来源于stack exchange,提问作者Uwe Jädick
相关产品推荐
相关产品推荐

