【问题标题】:Viewing user roles show the role id instead of the role name查看用户角色显示角色 ID 而不是角色名称
【发布时间】:2016-09-09 00:48:07
【问题描述】:

我正在尝试在 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());
    }

索引视图:

@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>

我的角色表:

我的 UserRoles 表:

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    这样的视图模型

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

    在视图中

    @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; } 
    }
    

    在视图中

      @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>
        }
    

    【讨论】:

    • 是的,我最终按照这些思路做了一些事情。我会将您的答案标记为答案。
    • @EgeErsoz 改进了答案
    • 在你的第一个例子中,你把数据库连接放在哪里?在视图模型中?
    • @megamaiku 您通常会在服务层内填充视图模型,或者,如果您没有,则在控制器操作方法中填充视图模型
    【解决方案2】:
    using System.Linq;
    using System.Data;
    using System.Data.Entity;
    
            var db = new ApplicationDbContext();
            var Users = db.Users.Include(u => u.Roles);
    
            foreach (var item in Users)
            {
                string UserName = item.UserName;
                string Roles = string.Join(",", item.Roles.Select(r=>r.RoleId).ToList());
            }
    

    【讨论】:

      猜你喜欢
      • 2021-11-02
      • 2021-04-06
      • 2012-10-08
      • 2021-06-15
      • 2014-09-23
      • 2018-05-09
      • 2019-12-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多