Je veux avoir la liste de tous les utilisateurs enregistrés sur mon site avec leurs rôles.
Id | Nom | Rôle
1 | ABC | Admin
2 | DEF | Utilisateur
Quelque chose comme ça, j'ai créé un contrôleur de rôles dans lequel tous les rôles sont répertoriés.
public ActionResult Index()
{
var roles = context.Roles.ToList();
return View(roles);
}
En vue
@model IEnumerable<Microsoft.AspNet.Identity.EntityFramework.IdentityRole>
@{
ViewBag.Title = "Index";
}
<div>
@foreach (var role in Model)
{
<p>
<strong>@role.Name | </strong>
</p>
}
</div>
Cela listera tous les rôles mais je veux la liste des utilisateurs avec leurs rôles.
S'il vous plaît donner une solution, Merci
Créez une nouvelle classe appelée UserViewModel. Cela agira comme un modèle de vue pour votre page.
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;}
}
Dans la méthode d'action du contrôleur, obtenez la liste des utilisateurs avec leurs rôles et mappez-la à 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);
}
Ensuite, utilisez le nouveau modèle dans la vue. Assurez-vous d'utiliser l'espace de nom correct ici où vous avez défini votre modèle de vue.
@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>
Bien qu'il soit très tard pour répondre à cette question, mais le voici pour les visites futures:
Créer une classe de modèle de vue:
public class UserViewModel
{
public string Username { get; set; }
public string Email { get; set; }
public string Role { get; set; }
}
Puis remplissez cette classe de modèle de vue dans le contrôleur:
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();
Ici, context.Users
représente la table AspNetUsers
qui a une propriété de navigation Roles
qui représente la table AspNetUserInRoles
. Ensuite, nous réalisons une jointure de context.Roles
qui représente la table AspNetRoles
pour obtenir le nom du rôle.
Maintenant, retournez cette liste à votre vue Index:
return View(userWithRoles);
Dans la vue, affichez la liste des utilisateurs avec des rôles:
@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>
Modifier: pour obtenir plusieurs rôles d'utilisateur (le cas échéant)
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)
});
J'ai une solution comme ci-dessus.
C’est une solution dans MVC 6.
Dans AccountViewModel.cs, ajoutez des modèles
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; }
}
le contrôleur est comme suit:
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);
}
enfin la vue:
@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>
J'ai aussi une solution comme ci-dessus. C'est une solution dans MVC 6 . La raison en est que j'essaie le code ci-dessus et que des problèmes se posent. alors..
commençons par créer une nouvelle classe appelée UserViewModel . Cela agira comme un modèle de vue pour votre page
public class UserViewModel
{
public string Username { get; set; }
public string Email { get; set; }
public string RoleName { get; set; }
}
Le contrôleur est comme suit:
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);
}
enfin la vue:
@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>