Rra*_*ras 11 asp.net-mvc asp.net-roles asp.net-identity
我希望列出在我的网站上注册的所有用户及其角色.
Id | 名称| 角色
1 | ABC | 管理员
2 | DEF | 用户
像这样的东西,我已经制作了Roles控制器,其中列出了所有角色.
public ActionResult Index()
{
var roles = context.Roles.ToList();
return View(roles);
}
Run Code Online (Sandbox Code Playgroud)
在视图中
@model IEnumerable<Microsoft.AspNet.Identity.EntityFramework.IdentityRole>
@{
ViewBag.Title = "Index";
}
<div>
@foreach (var role in Model)
{
<p>
<strong>@role.Name | </strong>
</p>
}
</div>
Run Code Online (Sandbox Code Playgroud)
这将列出所有角色,但我希望用户的列表及其角色.
请给出任何解决方案,谢谢
Imr*_*hid 11
创建一个名为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;}
}
Run Code Online (Sandbox Code Playgroud)
在控制器的操作方法中,获取用户列表及其角色,并将其映射到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);
}
Run Code Online (Sandbox Code Playgroud)
然后在视图中使用新模型.确保在定义视图模型的位置使用正确的命名空间.
@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>
Run Code Online (Sandbox Code Playgroud)
虽然回答这个问题已经很晚了,但是这里是为了将来的访问:
创建视图模型类:
public class UserViewModel
{
public string Username { get; set; }
public string Email { get; set; }
public string Role { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后在控制器中填充此视图模型类:
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();
Run Code Online (Sandbox Code Playgroud)
这里,context.Users表示AspNetUsers具有表示表的导航属性Roles的AspNetUserInRoles表.然后我们执行连接context.Roles代表AspNetRoles表以获取角色名称.
现在将此列表返回到您的索引视图:
return View(userWithRoles);
Run Code Online (Sandbox Code Playgroud)
在视图中显示具有角色的用户列表:
@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>
Run Code Online (Sandbox Code Playgroud)
编辑:获取用户的多个角色(如果已分配)
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)
});
Run Code Online (Sandbox Code Playgroud)
小智 5
我有如上所述的解决方案。
这是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; }
}
Run Code Online (Sandbox Code Playgroud)
控制器如下:
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);
}
Run Code Online (Sandbox Code Playgroud)
最后的看法:
@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>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
25273 次 |
| 最近记录: |