如何迭代IEnumerable并在剃刀视图中显示角色名

本文关键字:剃刀 视图 角色 显示 ApplicationUser 何迭代 迭代 IEnumerable | 更新日期: 2023-09-27 18:11:47

我使用带有MVC和razor视图的Identity 2.1.0。我的一个视图通过GET Controller Action获取所有用户的列表:

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

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

Customer
Employee

我还没能弄明白这个。我的部分问题是,我在剃刀视图中没有任何智能感知,并且无法在谷歌上找到任何有用的东西。

视图模型是@model IEnumerable<XXXX_My_App.Models.ApplicationUser>。ApplicationUser有一个基类IdentityUser

如何迭代IEnumerable<ApplicationUser>并在剃刀视图中显示角色名

最简单的方法是创建一个自定义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>

如果您的Usermanager返回一个identityusers列表,那么每个identityuser都应该有一个您应该能够枚举的roles属性。然而,只有当你的实现包含一个实现IRoleStore的类,但你没有提供实现的细节,所以我们只能猜测,这个才会被填充。

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