asp.net-mvc - 查看用户角色显示角色 ID 而不是角色名称

标签 asp.net-mvc entity-framework asp.net-identity asp.net-identity-2

我正在尝试在 ASP.NET Identity 中配置基于角色的授权。我希望管理员用户可以看到用户及其角色列表(在索引页面上)并更改单个用户的角色(在编辑页面上)。

这是我的背景:

modelBuilder.Entity<IdentityUser>()
    .HasKey<string>(k => k.Id)
    .ToTable("Users");
modelBuilder.Entity<IdentityUserRole>()
    .HasKey(r => new { r.RoleId, r.UserId })
    .ToTable("UserRoles");
modelBuilder.Entity<IdentityUserLogin>()
    .HasKey<string>(f => f.UserId)
    .ToTable("UserLogins");
modelBuilder.Entity<IdentityRole>()
    .ToTable("Roles");

我在 UsersController.cs 中的索引操作:

public ActionResult Index()
    {
        return View(db.Users.Include(i => i.Roles).ToList());
    }

索引 View :

@model List<Microsoft.AspNet.Identity.EntityFramework.IdentityUser>

//stuff

    @foreach (var item in Model)
    {
        <tr class="index-item" data-href="@Url.Action("Details", "Users", new { id=item.Id })">
            <td>
                @Html.DisplayFor(modelItem => item.Email)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Roles)">
            </td>
            <td class="index-links">
                //stuff
            </td>
        </tr>
    }
</table>

我的角色表:

Roles table

我的 UserRoles 表:

UserRoles Table

根据这些表,用户具有“查看者”角色。但是,该 View 不显示角色名称,而是显示角色 ID:

index view

如何让它显示角色名称(在本例中为“查看者”)?

最佳答案

IdentityUserRole 类没有 IdentityUserIdentityRole 的导航属性,只有 UserIdRoleId,获取用户的角色并不那么容易。所以我们需要使用2次db调用

var users = db.Users.Include(u => u.Roles);
var roles = db.Roles.Include(r => r.Users);

像这样的 ViewModel

public class UsersRolesViewModel 
{
     public List<ApplicationUser> Users { set; get; }
     public List<IdentityRole> Roles { set; get; }
}

和 View 中

@foreach (var user in Model.Users)
{
    <tr class="index-item" data-href="@Url.Action("Details", "Users", new { id= user.Id })">
        <td>
            @user.Email
        </td>
        <td>
            @string.Join(",", roles.Where(r => r.Users.Any(u => u.UserId == user.Id)).Select(r => r.Name))
        </td>
        <td class="index-links">
                //stuff
        </td>
    </tr>
}

编辑

您可以通过一次查询获取您想要的所有数据

var users = (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 UserDto() {User = u, Roles = query.ToList<string>()})
                         .ToList();

使用这个简单的模型

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

和 View 中

  @foreach (var user in Model.Users)
  {
        var appUser = user.ApplicationUser;
        var roles = user.Roles;

        <tr class="index-item" data-href="@Url.Action("Details", "Users", new { id= appUser.Id })">
            <td>
                @appUser.Email
            </td>
            <td>
                @string.Join(",", roles)
            </td>
            <td class="index-links">
                    //stuff
            </td>
        </tr>
    }

关于asp.net-mvc - 查看用户角色显示角色 ID 而不是角色名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37199545/

相关文章:

c# - 测试 WebApi Controller 时如何生成 Asp.net 用户身份

Asp.net 2.0 身份,ConfirmEmailAsync() 获取无效 token

javascript - 使用属性将多个文件绑定(bind)到数组

.net - Entity Framework 4 Single() vs First() vs FirstOrDefault()

c# - 在一个 ASP.NET MVC 5 解决方案中拥有单独的项目

mysql - 带有 MySQL 的 Entity Framework

c# - ASP.NET MVC DB 首先创建动态 dbcontext

c# - 全局异常过滤器或 Application_Error 都没有捕获未处理的异常

asp.net-mvc - 使用 Entity Framework 4.5 mvc4选择不重复的随机行

.net - 我能否使用 ASP.NET MVC 获得与 ASP.NET (Webforms) 完全相同的用户体验?