2015-01-03 2 views
9

Я хочу иметь список всех пользователей, зарегистрированных на моем сайте, с их ролями.Список пользователей с ролями в MVC Идентификатор Asp.net

Id | Имя | Роль


1 | ABC | Административные услуги


2 | DEF | User

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

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

В View

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

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

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

+0

'context.Users' должен иметь' Roles' свойство для каждого 'user':' var usersWithRoles = context.Users.Select (x => новый UserWithRolesViewModel {User = x, UserRoles = x.Roles}). ToList(); ' –

+0

Какое пространство имен следует добавить в представление этот метод actionResult? – Rras

+0

и что такое UserWithRolesViewModel после нового ключевого слова? Прошу прощения за такие глупые вещи, но я новичок в разработке MVC. – Rras

ответ

10

Создать новый класс 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> 
+0

Спасибо, я пробовал это. Он отображает список пользователей, но в ролях coulmn он не отображает имя ролей. Мне нужно имя роли, например Admin, User. – Rras

+0

«System.Data.Entity.DynamicProxies.IdentityUserRole_3D0B060DC86D63C1E4CDDA517BFE9D83ADB0E80» это то, что он показывает в столбце ролей – Rras

+0

Большое вам спасибо, он работает: D Если вы можете сказать мне еще одно, что, если я хочу сгруппировать пользователей в соответствии с Ролями , как и все админы вместе, тогда все пользователи – Rras

4

У меня есть решение, как указано выше.
Это решение в 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> 
+0

Это именно то, что я искал. Я надеялся, что лучшее решение так как это кажется несколько «взломанным». Странно, что они изменяют свойство «Роли» как список «IdentityUserRole», а не список «IdentityRole», поскольку нам тогда нужно сравнивать Id, а не только имя, хотя добавление пользователя с помощью «RoleManager» по-прежнему работает с именем роли, а не с идентификатором. – Detilium

4

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

Создать вид модели класс:

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> 

Edit: Для того, чтобы получить несколько ролей пользователя (если он назначен какой-либо)

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) 
        }); 
+0

Спасибо, Захир, ваш ответ действительно полезен. :) –

+0

Если у пользователя несколько ролей, несколько записей. того же пользователя. Можем ли мы перечислить все роли, назначенные пользователю в одном столбце? ... Также, если у пользователя нет ролей, они не отображаются, как мы можем показать пользователям, которым не назначены какие-либо роли? – 20B2

+0

@ 20B2, я обновил свой ответ, теперь он также показывает возможность показывать несколько ролей в одном столбце (разделенные запятой). Он также включает тех пользователей, которым не назначены роли –

Смежные вопросы