【问题标题】:Get user roles before returning to client ASP.NET Core在返回客户端 ASP.NET Core 之前获取用户角色
【发布时间】:2021-08-03 20:38:08
【问题描述】:

我需要创建一个控制器来分别获取和删除所有用户和某个用户,我已经弄清楚了获取用户、将他们添加到列表并返回列表的部分。但我在获取角色部分很挣扎。最初,我尝试了一个 Linq Select,它对于简单地获取角色来说效果很好(看起来不错),但对于获取特定用户的角色也不起作用。我还尝试了一种更糟糕的方法:从 db 中获取列表中的所有用户,foreach 列表和 foreach 中的每次迭代,创建一个我想要返回的类型的新对象并将角色分配给该用户相应的对象属性。不工作而且很丑。

TL;DR:这是在选择中获取角色的正确方法吗?“角色”属性是否需要为 IList 100%?

这是我的 GetRoles 方法:

[HttpGet]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
public IActionResult GetUsers()
{
   var userDbList = _userManager.Users.ToList();

   if (userDbList is null) return BadRequest(AppResources.UsersDoNotExist);

   // my initial select. GetUsersModel is just a model for the object 
   // I return and contains Name, Email, UserName and Role. As you can see,
   // the method is async but I get a cannot implicitly convert System.Collections
   // .Generic.IList<string> to string (I suspect I need to set Role as a List<string>?)
   var userList = userDbList.Select(async user => new GetUsersModel
   {
       Name = $"{user.FirstName} {user.LastName}",
       UserName = user.UserName,
       Email = user.Email,
       Role = await _userManager.GetRolesAsync(user)
   });

   /*var userList = new List<GetUsersModel>();

   foreach (var user in userDbList)
   {
       userList.Add(new GetUsersModel
       {
           Name = $"{user.FirstName} {user.LastName}",
           UserName = user.UserName,
           Email = user.Email,
           Role = await _userManager.GetRolesAsync(user)
       });
   }*/

   return Ok(userList);
}

我有一个类似的删除用户的方法,只是我首先检查请求数据并在一切正常的情况下删除用户,然后创建一个列表以包含在对象中(如果删除成功,还会显示一条消息)以返回。

【问题讨论】:

  • 我认为您的 User 对象具有 Roles 属性。如果是这样,当从数据库中检索用户时,你必须 Include() 像这样的角色:_context.Users.Include(u =&gt; u.Roles).ToList();
  • User 是一个添加到默认 IdentityUser 的模型:IdentityUser + First/Last Name,类似的东西并从 AspNetUsers 表中形成一个 DbSet。角色存储在 AspNetRoles 表中,因此需要 _userManager.GetRoles(user)。

标签: c#


【解决方案1】:

当您在选择中使用异步 lambda 时,这将返回 IEnumerable&lt;Task&lt;T&gt;&gt;。在您的情况下,变量userList 的类型为IEnumerable&lt;Task&lt;GetUsersModel&gt;&gt;。您需要等待所有任务并获得如下结果:

public IActionResult GetUsers()
{
    var userDbList = _userManager.Users.ToList();
    if (userDbList is null) return BadRequest(AppResources.UsersDoNotExist);

    IEnumerable<Task<GetUsersModel>> userListTasks = userDbList.Select(async user => new GetUsersModel
    {
        Name = $"{user.FirstName} {user.LastName}",
        UserName = user.UserName,
        Email = user.Email,
        Role = await _userManager.GetRolesAsync(user)
    });

    IEnumerable<GetUsersModel> userList = userListTasks.Select(t => t.Result);

    return Ok(userList);
}

如果UserManager.GetRolesAsync 方法不是线程安全的,那么:

public IActionResult GetUsers()
{
    var userDbList = _userManager.Users.ToList();
    if (userDbList is null) return BadRequest(AppResources.UsersDoNotExist);

    IEnumerable<GetUsersModel> userList = userDbList.Select(user => new GetUsersModel
    {
        Name = $"{user.FirstName} {user.LastName}",
        UserName = user.UserName,
        Email = user.Email,
        Role = _userManager.GetRolesAsync(user).Result
    });

    return Ok(userList);
}

【讨论】:

    猜你喜欢
    • 2020-08-25
    • 2020-09-19
    • 2019-06-16
    • 1970-01-01
    • 2016-09-29
    • 1970-01-01
    • 2018-08-20
    • 2018-01-08
    • 2018-10-29
    相关资源
    最近更新 更多