ASP.NET Core 2.1 с отображением пользователей и ролей - PullRequest
0 голосов
/ 17 февраля 2019

Пытаясь отобразить пользователей вместе с их ролью в ядре 2.1, я последовал примеру stackoverflow .У меня нет ошибок, но я не показываю роли пользователей.Я думаю, что это мое мнение, по какой-то причине мой код возвращает адрес электронной почты вместо роли пользователя.

ApplicationDbContext

public class ApplicationDbContext : IdentityDbContext<ApplicationUser, 
ApplicationRole, string, IdentityUserClaim<string>,
ApplicationUserRole, IdentityUserLogin<string>,
IdentityRoleClaim<string>, IdentityUserToken<string>>

{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
       : base(options)
    {
    }

    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);

        builder.Entity<ApplicationUserRole>(userRole =>
        {
            userRole.HasKey(ur => new { ur.UserId, ur.RoleId });

            userRole.HasOne(ur => ur.Role)
                .WithMany(r => r.UserRoles)
                .HasForeignKey(ur => ur.RoleId)
                .IsRequired();

            userRole.HasOne(ur => ur.User)
                .WithMany(r => r.UserRoles)
                .HasForeignKey(ur => ur.UserId)
                .IsRequired();
        });
    }

    public DbSet<ApplicationUser> ApplicationUser { get; set; }
}

Startup.cs

services.AddIdentity<ApplicationUser, ApplicationRole>()
      .AddEntityFrameworkStores<ApplicationDbContext>()
      .AddDefaultUI()
      .AddDefaultTokenProviders();

ApplicationUser

public class ApplicationUser : IdentityUser
{
    public ICollection<ApplicationUserRole> UserRoles { get; set; }

    public class ApplicationUserRole : IdentityUserRole<string>
    {
        public virtual ApplicationUser User { get; set; }
        public virtual ApplicationRole Role { get; set; }
    }
    public class ApplicationRole : IdentityRole
    {
        public ICollection<ApplicationUserRole> UserRoles { get; set; }
    }
}

Индексный метод:

public async Task<IActionResult> Index(int? page )
{
   var users = from u in _userManager.Users.Include(u => u.UserRoles).ThenInclude(ur => ur.Role) select u;

   return View(users.ToPagedList(pageNumber, pageSize));
}

Просмотр

@Html.DisplayFor(m => item.UserRoles)

1 Ответ

0 голосов
/ 17 февраля 2019

Вы помещаете все в класс ApplicatonUser.Сначала измените классы вашей модели следующим образом:

public class ApplicationUser : IdentityUser
{
    public ICollection<ApplicationUserRole> UserRoles { get; set; }
}

public class ApplicationUserRole : IdentityUserRole<string>
{
    public virtual ApplicationUser User { get; set; }
    public virtual ApplicationRole Role { get; set; }
}

public class ApplicationRole : IdentityRole
{
    public ICollection<ApplicationUserRole> UserRoles { get; set; }
}

Теперь UserRoles - это коллекция, вы не можете отобразить это с помощью @Html.DisplayFor(m => item.UserRoles), вместо этого вам нужно выполнить итерацию по этой коллекции следующим образом:

@model List<ApplicationUser>
@{
    foreach (ApplicationUser applicationUser in Model)
    {
        <div>UserName : @applicationUser.UserName</div>
        <br/>
        <h4>User's Role</h4>
        <hr/>
        foreach (ApplicationUserRole applicationUserRole in applicationUser.UserRoles)
        {
            <div>RoleName: @applicationUserRole.Role.Name</div>
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...