You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决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?
}

遇到的问题

  1. 调用UserManager.GetRolesAsync时,传入userId.Id(字符串ID)、用户名、user对象均报CS1503错误;
  2. 仅传入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 05:13:12