ASP.NET Core 1.1获取所有用户及其角色

时间:2017-04-22 17:11:56

标签: c# asp.net-mvc entity-framework asp.net-identity

我是.NET的新手,试图获取所有注册用户的列表及其角色名称,并使用viewModel将它们发送到视图。

这是ViewModel:

<!DOCTYPE html>
<html>

<head>
  <title></title>
</head>

<body>
  <style type="text/css">
    table {
      width: 200px;
      height: 200px;
      background-color: blue;
      text-align: center;
    }
    
    td {
      background-color: yellow;
    }
    
    input {
      width: 50px;
      height: 50px;
      vertical-align: middle;
    }
    
    label {
      vertical-align: middle;
    }
  </style>
  <table>

    <tr>

      <td>
        <input type="checkbox" name="" id="c1">
        <label for="c1">FFFF</label>
      </td>
    </tr>
  </table>
</body>

</html>

我尝试了这个以获取所有用户及其角色,并为每个用户创建一个ViewModel,并将所有视图模型放在一个列表中以传递给View:

public class ApplicationUserListViewModel
{
    [Display(Name = "User Email Address")]
    public string UserEmail { get; set; }

    public  List<IdentityUserRole<string>> Roles { get; set; }
}

但是当我明确地为每个用户分配角色时,这总是为每个用户提供0个角色。

2 个答案:

答案 0 :(得分:10)

您自己解决了,但您的解决方案并不完美,因为它会导致性能问题。您正在向数据库执行一个请求以查询用户,然后在foreach循环中为每个用户执行新查询以获取其相关角色,这非常糟糕。如果您的数据库中有X用户,您最终将使用:

  • 获取用户的一个查询
  • X查询以获取每个用户的角色。

您可以通过在一个查询中包含相关角色来做得更好,如下所示:

foreach (var user in _userManager.Users.Include(u => u.Roles).ToList())
{              
    list.Add(new ApplicationUserListViewModel {
        UserEmail = user.Email,
        Roles = user.Roles
    });
}

或者只是这个:

var users = _userManager.Users.Include(u => u.Roles)
                        .Select(u => new ApplicationUserListViewModel {
                            UserEmail = user.Email,
                            Roles = user.Roles
                        })
                        .ToList();

ASP.NET Core Identity 2.x的更新

此解决方案对于ASP.NET Core Identity 2.x无效,因为IdentityUser不再包含Roles属性。有关ASP.NET Core Identity 2.x的信息,请参阅this answer

答案 1 :(得分:2)

嗯,我得到了这个工作。这可能不是应该怎么做但它运作正常。

Start