【问题标题】:ASP.Net MVC List of User and their RolesASP.Net MVC 用户及其角色列表
【发布时间】:2017-09-19 09:07:00
【问题描述】:

我正在使用 ASP.NET MVC 默认项目。在那里,我们有一个名为 AspNetRoles 的数据库(定义了管理员、用户等角色)

然后有一个名为 AspNetUsers 的数据库,它只在您注册用户时定义用户

最后也是最重要的是 AspNetUserRoles。当您将角色分配给用户时,这里就是放置它的位置(并且 Id 被散列)

我的问题是,如何获取系统上每个用户及其角色的列表?我不知道如何开始这样做。我应该创建自己的用户和角色数据库而忘记默认的吗?或者有没有办法用默认的创建?


另外,我要记住,到目前为止,我正在分配角色 注册(默认为用户)以及稍后创建索引时 我显示了用户和角色列表,我想编辑它们,但是这个 只是一个免责声明。 非常感谢您的任何帮助。

【问题讨论】:

  • 每个用户的角色列表?还是登录的用户?
  • 每个用户的列表。
  • SELECT * FROM AspNetUsers 可能是一个好的开始......你到底不明白什么? 我应该创建自己的用户和角色数据库 是吗?为什么?你的那个有什么问题?
  • 没什么问题,我有很多教程都在使用他们自己的教程,我认为这可能是一个很好的做法,只是想问一下。
  • 我认为你需要进一步阅读这个主题。

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


【解决方案1】:

没有用于检索用户列表及其角色的内置方法,因此您可以尝试获取用户及其角色,如下所示(使用 EF):

var list = context.Users        
    .Where(x => x.Roles.Select(a => a.Id))
    .ToList();

使用它,您可以获得每个用户和分配的角色。

更新 首先创建一个如下所示的模型:

public class UserRoleInfo
{
    public ApplicationUser User { set; get; }
    public List<string> Roles { set; get; } 
}

那么你的查询就像(查询语法):

var listOfUsers = (from u in db.Users
             let query = (from ur in db.Set<IdentityUserRole>()
                          where ur.UserId.Equals(u.Id)
                          join r in db.Roles on ur.RoleId equals r.Id select r.Name)
                          select new UserRoleInfo() {User = u, Roles = query.ToList<string>()})
                         .ToList();

上面的查询将返回每个用户及其角色,无论有多少。

更新

你的看法是这样的:

@model UserRoleInfo
    <table>
        <tbody>
@foreach (var user in Model)
{
    var appUser = user.ApplicationUser;
    var roles = user.Roles;

            <tr>
                <td>
                    @appUser.Email
                </td>
                <td>
                    @string.Join(",", roles)
                </td>
            </tr>

}
        </tbody>
    </table>

【讨论】:

  • 我忘了说,但是是的,我正在使用实体框架。而且这种方法不起作用,因为它只会显示 Id(散列的 Id),这不是很讨人喜欢。
  • 显示Id(hashed Id),不是很讨人喜欢。那还不显示?!
  • @B.Zab 您可以进行所需的选择。这只是一个例子。你想返回什么?
  • @ecKO 我想显示用户名(电子邮件)及其分配的角色。但就我现在所见,这并不难。我在哪里写这个方法呢?
  • 点赞Roles.Select(a =&gt; a.Name)
【解决方案2】:

获取系统上每个用户及其角色的列表:

SELECT        UserRoleId, UserId, RoleId, dbo.GetRoleName(RoleId) AS RoleName
FROM            dbo.UserRoles

函数:dbo.GetRoleName -

function [dbo].[GetRoleName](@input int)
Returns Nvarchar(500)
As
Begin
Declare @RoleName nvarchar(500)
Set @RoleName=(select Name from Roles where RoleId=@input)
return @RoleName
End

【讨论】:

  • 这是一个 SQL 函数吗?为什么要创建一个 SQL 函数来执行 SELECT?选择有什么问题?或者可能是 INNER JOIN?
【解决方案3】:

我建议采用这种方式,因为这会将数据库中的所有用户作为列表返回,其各自的角色附加在用户对象中。 此外,它在 Roles 实体上使用热切加载,因此它将被转换为数据库中的联接。

如果您只想获取一个用户及其角色,其中只需添加 where 条件并按其 ID 过滤。

var users = _applicationDbContext.Users.Include(x => x.Roles).ToList();
foreach (var applicationUser in users)
{
    var userRoles = applicationUser.Roles;
    //Do something with this user roles
}

【讨论】:

    猜你喜欢
    • 2016-04-28
    • 1970-01-01
    • 2023-04-04
    • 2016-05-03
    • 1970-01-01
    • 2017-09-19
    • 1970-01-01
    • 2018-11-11
    • 1970-01-01
    相关资源
    最近更新 更多