在 MVC Asp.net 身份中具有角色的用户列表
List of Users with roles in MVC Asp.net identity
我想要在我的网站上注册的所有用户及其角色的列表。
编号 |名称 |角色
1 |美国广播公司 |管理员
2 |防御力 |用户
像这样,我制作了 Roles 控制器,其中列出了所有角色。
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>
这将列出所有角色,但我想要用户列表及其角色。
请给出任何解决方案,谢谢
创建一个名为 UserViewModel 的新 class。这将作为您页面的视图模型。
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>
我有上面的解决方法。
这是 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>
虽然现在回答这个问题已经很晚了,但是为了以后的访问:
创建视图模型class:
public class UserViewModel
{
public string Username { get; set; }
public string Email { get; set; }
public string Role { get; set; }
}
然后在控制器中填充此视图模型class:
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
table有导航属性Roles
代表AspNetUserInRoles
table.然后我们对代表AspNetRoles
table的context.Roles
进行join,得到角色名
现在 return 此列表到您的索引视图:
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 中的解决方案。
这样做的原因是我尝试了上面的代码并遇到了问题。所以..
让我们开始创建一个名为 UserViewModel 的新 class。这将作为您页面的视图模型
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>
这是我获得具有 his/her 角色的用户的解决方案
创建一个 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; }
}
在 Controller 中:Select 所有像下面这样的用户都使用 UserManager 并将它们放在一个变量中
var users = _userManager.Users.ToList();
创建一个空列表:其中一个 userRoles 并为其命名
列出 usersRoles = new List();
循环遍历所有用户,同时使用角色管理器循环 select 所有角色,并将用户变量传递给它。如果角色不为 null 或为空(此处您必须确保所有用户都分配有角色)。创建一个新的 userRole 并用数据库值填充它,然后将其添加到您在上面创建的空列表中,然后您可以 return 它但是你想要(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);
}
}
我想要在我的网站上注册的所有用户及其角色的列表。
编号 |名称 |角色
1 |美国广播公司 |管理员
2 |防御力 |用户
像这样,我制作了 Roles 控制器,其中列出了所有角色。
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>
这将列出所有角色,但我想要用户列表及其角色。
请给出任何解决方案,谢谢
创建一个名为 UserViewModel 的新 class。这将作为您页面的视图模型。
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>
我有上面的解决方法。
这是 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>
虽然现在回答这个问题已经很晚了,但是为了以后的访问:
创建视图模型class:
public class UserViewModel
{
public string Username { get; set; }
public string Email { get; set; }
public string Role { get; set; }
}
然后在控制器中填充此视图模型class:
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
table有导航属性Roles
代表AspNetUserInRoles
table.然后我们对代表AspNetRoles
table的context.Roles
进行join,得到角色名
现在 return 此列表到您的索引视图:
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 中的解决方案。 这样做的原因是我尝试了上面的代码并遇到了问题。所以..
让我们开始创建一个名为 UserViewModel 的新 class。这将作为您页面的视图模型
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>
这是我获得具有 his/her 角色的用户的解决方案
创建一个 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; }
}
在 Controller 中:Select 所有像下面这样的用户都使用 UserManager 并将它们放在一个变量中
var users = _userManager.Users.ToList();
创建一个空列表:其中一个 userRoles 并为其命名 列出 usersRoles = new List();
循环遍历所有用户,同时使用角色管理器循环 select 所有角色,并将用户变量传递给它。如果角色不为 null 或为空(此处您必须确保所有用户都分配有角色)。创建一个新的 userRole 并用数据库值填充它,然后将其添加到您在上面创建的空列表中,然后您可以 return 它但是你想要(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);
}
}