【问题标题】:How do I get an AppUser's role in Razor?如何在 Razor 中获取 AppUser 的角色?
【发布时间】:2017-03-16 14:52:38
【问题描述】:

对于我的用户列表视图,我发送了一个 AppUser 列表:IdentityUser,如下所示:

    public AccountAdminController(UserManager<AppUser> userManager,
        RoleManager<IdentityRole> rolesManager)
    {
        _userManager = userManager;
        _roleManager = rolesManager;
    }

    // List Users
    public ViewResult Index()
    {
        return View(_userManager.Users);
    } 

我在视图中这样渲染用户:

@model IEnumerable<AppUser>

foreach (AppUser user in Model)
{
    <tr>
        <td>@user.Id</td>
        <td>@user.UserName</td>
        <td>Role</td>
        <td>@user.Email</td>
        <td>
            <a id="editModal" data-toggle="modal" data-target="#modal_box"
                               class="btn btn-sm btn-primary"
                               asp-action="EditUser" asp-route-id="@user.Id">Edit</a>
            <a id="deleteConfirmModal" data-toggle="modal" data-target="#modal_box"
                               class="btn btn-sm btn-danger"
                               asp-action="DeleteConfirm" asp-route-id="@user.Id">Delete</a>
       </td>
   </tr>
}

如何获取角色列中每个用户的角色?

每个用户的角色集合都是空的,计数为 0,即使我知道该用户具有角色。每个用户只有一个角色,所以我需要拉@user.Roles.FirstOrDefault().Name。

但它不存在。 我该如何解决这个问题?

更新 1

如果我使用包含来执行此操作:

    public ViewResult Index()
    {
        return View(_userManager.Users.Include(u => u.Roles));
    } 

然后在视图中:

<td>@user.Roles</td>

它呈现这个:

System.Collections.Generic.List`1[Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserRole`1[System.String]]

现在如果我尝试延长剃刀线:

@user.Roles.FirstOrDefault().

我在智能感知中唯一得到的是 RoleId,没有角色名称。

【问题讨论】:

  • 它不会像魔术一样打开集合,你必须解开它......另一个循环......总共2个for循环。 1 代表用户,然后 1 代表每个用户的角色。
  • 你可以为asp-net-identity-2找到一个类似SQL的查询here,但同样的查询应该适用于asp.net-core-identity

标签: asp.net-identity asp.net-core-mvc


【解决方案1】:

你可以做这样的事情。尚未测试代码,因此可能需要进行一些返工,但应该可以让您朝着正确的方向前进。

在您的视图模型中

public class UserViewModel
{
    public ApplicationUser User { get; set; }
    public List<Role> Roles { get; set; }
}

在你的控制器中

var usersViewModel = new List<UserViewModel>();
var roles = db.Roles.ToList();
foreach (var user in db.Users)
{
    usersViewModel.Add(new UserViewModel
    {
        User = user,
        Roles = roles.Where(m => m.Users.Any(x => x.UserId == User.Id).ToList();
    });
}
return View(usersViewModel);

【讨论】:

    【解决方案2】:
        **try This**
    @if (Request.IsAuthenticated)
    {
    var db = new ApplicationDbContext();
    var UserID = User.Identity.GetUserId();
    var CurrentUser = db.Users.Where(a => a.Id == UserID).SingleOrDefault();
    var roleId = CurrentUser.Roles.FirstOrDefault().RoleId.ToString();
    var roleName = db.Roles.Find(roleId).Name.ToString();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-23
      • 2022-01-15
      • 1970-01-01
      • 1970-01-01
      • 2015-11-17
      • 2021-02-25
      • 1970-01-01
      • 2019-07-11
      相关资源
      最近更新 更多