【问题标题】:How to iterate Roles in IEnumerable<ApplicationUser> and display role names in razor view如何在 IEnumerable<ApplicationUser> 中迭代角色并在 razor 视图中显示角色名称
【发布时间】:2014-08-26 15:31:14
【问题描述】:

我正在使用带有 MVC 和 razor 视图的 Identity 2.1.0。我的一个观点通过这个 GET 控制器操作获得了所有用户的列表:

public async Task<ActionResult> Users()
{
    return View(await UserManager.Users.ToListAsync());
}

在视图中有一个 foreach 遍历每个用户并显示常用信息,如电子邮件地址、用户名等。我想知道是否还有一种方法可以遍历每个用户的角色,以便我可以像这样显示每个用户的角色成员身份:

Customer
Employee

我无法弄清楚这一点。我的部分问题是我在 razor 视图中没有任何 Intellisense,也无法在 Google 上找到任何有用的信息。

视图模型是@model IEnumerable&lt;XXXX_My_App.Models.ApplicationUser&gt;。 ApplicationUser 有一个 IdentityUser 基类。

【问题讨论】:

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


    【解决方案1】:

    最简单的方法是创建一个自定义 ViewModel,其中包含用户本身和他所属的角色。实现可能如下所示:

    控制器

    public async Task<ViewResult> Users()
    {
        var users = UserManager.Users;
        var model = new Collection<UserRoleViewModel>();
    
        foreach (var user in users)
        {
            var roles = await UserManager.GetRolesAsync(user.Id);
            var rolesCollection = new Collection<IdentityRole>();
    
            foreach (var role in roles)
            {
                var role = await RoleManager.FindByNameAsync(roleName);
                rolesCollection.Add(role);
            }
    
            model.Add(new UserRoleViewModel { User = user, Roles = rolesCollection });
        }
    
        return View("Users", model);
    }
    

    UserRoleViewModel

    public class UserRoleViewModel
    {
        public ApplicationUser User { get; set; }
    
        public Collection<IdentityRole> Roles { get; set; }
    }
    

    这样,您可以在视图中使用以下模型来迭代适当的属性

    @model ICollection<YourProject.Models.UserRoleViewModel>
    

    【讨论】:

    • 我返回 IEnumerable 的一行代码有点崩溃,但我认为你是对的。我不确定如何编写 ViewModel,但你说得很清楚。感谢您花时间展示如何做到这一点。
    • Horizo​​n_Net,您的示例代码中存在一些错误,尽管您确实为我指明了一个好的方向(rolesConnection 与 rolesCollection 等)。此外,每个user 都有一个Roles,其中包含角色中所有用户ID 的列表——有点矫枉过正,但我​​会处理这个。 RoleNames 没有任何功能用途 - 它们仅用于显示,我需要的只是 RoleName。在视图中,我以前可以使用@Html.DisplayNameFor(model =&gt; model.UserName) 显示列标题。这显然不再有效。如何使用这个新模型获取列名?
    • 只有我们 IntelliSense。你可以像@Html.DisplayNameFor(model =&gt; model.User.UserName)这样访问属性。
    • 我无法在 .cshtml 中获取 Intellisense。我也无法单步执行或设置断点。我已经尝试了所有我能想到的方法,包括卸载和重新安装 VS 2013.2。所以,我在这一点上有障碍。不过我确实想通了。谢谢!
    • 谢谢。我需要添加'MultipleActiveResultSets = True;'到 ConnectionString。
    【解决方案2】:

    如果您的 Usermanager 正在返回一个身份用户列表,那么每个身份用户都应该有一个您应该能够枚举的角色属性。但是,只有当您的实现包含实现 IRoleStore 的类但您没有提供实现的详细信息时,才会填充此信息,因此我们只能猜测。

    http://msdn.microsoft.com/en-us/library/dn613256(v=vs.108).aspx

    【讨论】:

    • Hargrovm,有一个 .Roles 属性,我可以遍历它以输出 RoleId 属性。我现在正试图弄清楚如何获取 RoleId 的 RoleName。
    • 我很惊讶如果你能得到 id,你不能得到 role.name -我知道的还不够 - 我只做了一点关于身份的工作,然后它是 1.0但是有一个角色管理器,所以也许您可以使用角色管理器的 id 来获取角色的实例。对于如此明显的事情,似乎需要付出很多努力。角色应该返回 TRole,其中 TRole:identityrole 和身份角色应该具有 name 和 Id 属性,所以我不知道。 Rolemanager 应该有一个 findbyidasync 方法。
    • UserManager 类在我的应用程序中包含所有这些方法。我从一个 Identity 2.0 示例应用程序对其进行建模。 UserManager 也有 RoleStore。我的应用程序中的 ApplicationUser 包含一个 .Roles,其中包含 RoleId 和 UserId。我可以为此视图创建一个新模型,但我只是想弄清楚在剃刀视图中需要发生什么以从 RoleId 获取 RoleName。是的,我见过的大多数示例都有 .Name 属性...
    猜你喜欢
    • 1970-01-01
    • 2021-04-06
    • 2019-03-16
    • 2014-09-23
    • 2015-09-01
    • 2016-09-09
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    相关资源
    最近更新 更多