Список пользователей с ролями в MVC Asp.net идентичности

Я хочу иметь список всех пользователей, зарегистрированных на моем сайте с их ролями.

Id | Имя | Роль


1 | ABC | Администратор


2 | DEF | пользователь

Как-то так, я сделал контроллер ролей, в котором перечислены все роли.

 public ActionResult Index()
    {
        var roles = context.Roles.ToList();
        return View(roles);
    }

Ввиду

@model IEnumerable<Microsoft.AspNet.Identity.EntityFramework.IdentityRole>
@{
    ViewBag.Title = "Index";
}    
<div>
    @foreach (var role in Model)
    {
        <p>
            <strong>@role.Name | </strong>
        </p>
    }
</div>

Это перечислит все роли, но я хочу список пользователей с их ролями.

Пожалуйста, дайте любое решение, спасибо

5 ответов

Решение

Создайте новый класс с именем UserViewModel. Это будет служить моделью для просмотра вашей страницы.

public class GroupedUserViewModel
{
    public List<UserViewModel> Users {get; set;}
    public List<UserViewModel> Admins {get; set;}
}

public class UserViewModel
{
    public string Username {get; set;}
    public string Roles {get; set;}
}

В методе действия контроллера получите список пользователей вместе с их ролями и сопоставьте их с UserViewModel.

public ActionResult Index()
{
    var allusers = context.Users.ToList();
    var users = allusers.Where(x=>x.Roles.Select(role => role.Name).Contains("User")).ToList();
    var userVM = users.Select(user=>new UserViewModel{Username = user.FullName, Roles = string.Join(",", user.Roles.Select(role=>role.Name))}).ToList();

    var admins = allusers.Where(x=>x.Roles.Select(role => role.Name).Contains("Admin")).ToList();
    var adminsVM = admins.Select(user=>new UserViewModel{Username = user.FullName, Roles = string.Join(",", user.Roles.Select(role=>role.Name))}).ToList(); 
    var model = new GroupedUserViewModel{Users = userVM, Admins = adminsVM};

    return View(model);
}

Тогда используйте новую модель в представлении. Обязательно используйте правильное пространство имен здесь, где вы определили модель представления.

@model Models.GroupedUserViewModel
@{
    ViewBag.Title = "Index";
}    
<div>
    @foreach (var user in Model.Admins)
    {
        <p>
            <strong>@user.Username | @user.Roles </strong>
        </p>
    }

    @foreach (var user in Model.Users)
    {
        <p>
            <strong>@user.Username | @user.Roles </strong>
        </p>
    }
</div>

Хотя уже очень поздно отвечать на этот вопрос, но вот это для будущих визитов:

Создать класс модели представления:

public class UserViewModel
{
    public string Username { get; set; }
    public string Email { get; set; }
    public string Role { get; set; }
}

Затем заполните этот класс модели представления в контроллере:

var usersWithRoles = (from user in context.Users
                      from userRole in user.Roles
                      join role in context.Roles on userRole.RoleId equals 
                      role.Id
                      select new UserViewModel()
                      {
                          Username = user.UserName,
                          Email = user.Email,
                          Role = role.Name
                      }).ToList();

Вот, context.Users представляет AspNetUsers таблица, которая имеет свойство навигации Roles который представляет AspNetUserInRoles Таблица. Затем мы выполняем соединение context.Roles который представляет AspNetRoles таблица, чтобы получить имя роли.

Теперь верните этот список в индексное представление:

return View(userWithRoles);

В представлении показать список пользователей с ролями:

@model IEnumerable<MyProject.Models.UserViewModel>
<div class="row">
        <h4>Users</h4>

        @foreach (var user in Model)
        {
            <p>
                <strong>
                    @user.Username | @user.Email | @user.Role
                </strong>
            </p>
        }            
</div>

Редактировать: чтобы получить несколько ролей пользователя (если они назначены)

var usersWithRoles = (from user in _ctx.Users
                     select new
                     {
                         Username = user.UserName,
                         Email = user.Email,
                         RoleNames = (from userRole in user.Roles
                                      join role in _ctx.Roles on userRole.RoleId equals role.Id
                                      select role.Name).ToList()
                     }).ToList().Select(p => new UserViewModel()

                     {
                         Username = p.Username,
                         Email = p.Email,
                         Role = string.Join(",", p.RoleNames)
                     });

У меня есть решение, как указано выше.
Это решение в MVC 6.

В AccountViewModel.cs добавить модели

public class GroupedUserViewModel
{
    public List<UserViewModel> Users { get; set; }
    public List<UserViewModel> Admins { get; set; }
}
public class UserViewModel
{
    public string Username { get; set; }
    public string Email { get; set; }
    public string RoleName { get; set; }
}

контроллер выглядит следующим образом:

    public ActionResult Index()
    {            
        var role = (from r in context.Roles where r.Name.Contains("Adviser") select r).FirstOrDefault();            
        var users = context.Users.Where(x => x.Roles.Select(y => y.RoleId).Contains(role.Id)).ToList();

        var userVM = users.Select(user => new UserViewModel
        {
            Username = user.UserName,
            Email = user.Email,
            RoleName = "Adviser"
       }).ToList();


        var role2 = (from r in context.Roles where r.Name.Contains("Admin") select r).FirstOrDefault();
        var admins = context.Users.Where(x => x.Roles.Select(y => y.RoleId).Contains(role2.Id)).ToList();

        var adminVM = admins.Select(user => new UserViewModel
        {
            Username = user.UserName,
            Email = user.Email,
            RoleName = "Admin"
        }).ToList();


        var model = new GroupedUserViewModel { Users = userVM, Admins = adminVM };
        return View(model); 

    }

наконец то мнение:

@model ToroCRM.Models.GroupedUserViewModel
<div class="row">
        <h4>Users</h4>
        @foreach (var user in Model.Users)
        {
            <p>
                <strong>
                    @user.Username <br />
                    @user.Email<br />
                    @user.RoleName
                </strong>
            </p>
        }
        <h4>Advisers</h4>
        @foreach (var usera in Model.Admins)
        {
            <p>
                <strong>
                    @usera.Username <br />
                    @usera.Email<br />
                    @usera.RoleName
                </strong>
            </p>
        }
</div>

У меня также есть решение, как указано выше. Это решение в MVC 6. Причиной этого является то, что я пробую приведенный выше код и столкнулся с проблемами. так..

Давайте начнем. Создайте новый класс с именем UserViewModel. Это будет служить моделью для просмотра вашей страницы

public class UserViewModel
{
    public string Username { get; set; }
    public string Email { get; set; }
    public string RoleName { get; set; }
}

Контроллер выглядит следующим образом:

public ActionResult Index()
    { 
       List<UserViewModel> modelLst = new List<UserViewModel>();
            var role = _db.Roles.Include(x => x.Users).ToList();

            foreach (var r in role)
            {
                foreach (var u in r.Users)
                {
                    var usr = _db.Users.Find(u.UserId);
                    var obj = new UserViewModel
                    {
                        Username = usr.FullName,
                        Email = usr.Email,
                        RoleName = r.Name
                    };
                    modelLst.Add(obj);
                }

            }
     return View(modelLst); 

    }

наконец то мнение:

@model IEnumerable<ToroCRM.Models.UserViewModel>

<div class="row">
 @foreach (var r in Model.DistinctBy(x=>x.RoleName).ToList())
    {

        <h4>@r.RoleName</h4><hr />
        <table class="table">
        foreach (var user in Model.Where(x=>x.RoleName == r.RoleName))
         {
              <tr><th>@user.Username</th><td>@user.Email</td></tr> 
         }
        </table>

    }
</div>

Вот мое решение, чтобы получить пользователя с его/ее ролью

Создайте ViewModel для хранения пользователей с ролями, как показано ниже.

      public class UsersRoles
{
    public string UserId { get; set; }
    public string Username { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string PhoneNumber { get; set; }
    public string Email { get; set; }
    public string Role { get; set; }
}

В контроллере: выберите всех пользователей, как показано ниже, с помощью UserManager и поместите их в переменную.

      var users = _userManager.Users.ToList();

Создайте пустой список: одну из ролей пользователей и дайте ей имя List usersRoles = new List();

Переберите всех пользователей и во время цикла выберите все роли, используя диспетчер ролей и передав ему пользовательскую переменную. Если роль не является нулевой или пустой (здесь вы должны убедиться, что всем пользователям назначена роль). Создайте новую userRole и заполните ее значениями базы данных, а затем добавьте ее в пустой список, который вы создали выше, после чего вы можете вернуть ее, как хотите (usersRoles), и отобразить ее как IENumerable в своем представлении и отобразить роли как роль.

             foreach (var user in users)

        {
            var roles = await _userManager.GetRolesAsync(user);

            var role = roles.FirstOrDefault();

            if(!string.IsNullOrEmpty(role))
            {
               var usersRole = new UsersRoles()
                {
                   UserId = user.Id,
                   Username = user.UserName,
                   Email = user.Email,
                   FirstName = user.FirstName,
                   LastName = user.LastName,
                   PhoneNumber = user.PhoneNumber,
                   Role = role
               };

                usersRoles.Add(usersRole);
            }

        }
Другие вопросы по тегам