按角色筛选用户
本文关键字:用户 筛选 角色 | 更新日期: 2023-09-27 17:58:49
我有一个带有标准帐户控制器的常规MVC应用程序。我在UserProfile类中添加了几个字段,所以现在看起来是这样的:
public class UserProfile
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int UserId { get; set; }
public string UserName { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public string Address { get; set; }
public string Phone { get; set; }
public string FullName { get { return FirstName + " " + LastName; } }
public int GroupId { get; set; }
[ForeignKey("GroupId")]
public ICollection<Group> Groups { get; set; }
}
所以,基本上说用户可以被分配到多个组。(在Group类中,我还说Group可以包含多个用户,这很明显)。
现在,每个用户都必须具有特定的角色。(管理员、教师、学生等)
我通过以下在线教程添加了角色支持:
<roleManager enabled="true" defaultProvider="SimpleRoleProvider">
<providers>
<clear/>
<add name="SimpleRoleProvider" type="WebMatrix.WebData.SimpleRoleProvider, WebMatrix.WebData"/>
</providers>
</roleManager>
<membership defaultProvider="SimpleMembershipProvider">
<providers>
<clear/>
<add name="SimpleMembershipProvider" type="WebMatrix.WebData.SimpleMembershipProvider, WebMatrix.WebData" />
</providers>
</membership>
现在我想按角色名称筛选所有用户。但我没有任何办法做到这一点
IE。类似这样的东西。Users.Where(x=>x.RoleName=="Admin").Select(x=>x.FullName)
(Users
是类型为ICollection<Users>
的Group类的属性)。我如何在没有角色课程的情况下获得角色?
asp.net成员有一个带有GetUsersInRole方法的静态Roles类,HttpContext中的CurrentUser也可以告诉您活动用户所处的角色。
http://msdn.microsoft.com/en-us/library/system.web.security.roles.getusersinrole.aspx
http://msdn.microsoft.com/en-us/library/system.web.security.membershipuser.aspx
这里有一个基于Luke建议的例子。
UsersContext类构造函数应该如下所示:
public class UsersContext : DbContext
{
public UsersContext()
: base("DefaultConnection")
{
}
public DbSet<UserProfile> UserProfiles { get; set; }
public DbSet<RoleModel> Roles { get; set; }
public DbSet<UsersInRole> UsersInRoles { get; set; }
}
请注意,我添加了另外两个DbSet。这些已经在成员数据库中了,这只是我们映射它们的方式。
"RoleModel"answers"UsersInRole"模型声明如下:
[Table("webpages_Roles")]
public class RoleModel
{
[Key]
public int RoleId { get; set; }
public string RoleName { get; set; }
}
[Table("webpages_UsersInRoles")]
public class UsersInRole
{
[Key, Column(Order=0)]
public int UserId { get; set; }
public virtual UserProfile User { get; set; }
[Key, Column(Order = 1)]
public int RoleId { get; set; }
public RoleModel Role { get; set; }
}
之后,您可以在UserProfile Model中添加一个新的导航属性,如下所示:
[Table("UserProfile")]
public class UserProfile
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int UserId { get; set; }
public string UserName { get; set; }
public virtual ICollection<UsersInRole> UsersInRole { get; set; }
}
然后用类似于的东西来称呼它
var context = new UsersContext();
context.UserProfiles.First(d => d.UserName == "username").UsersInRole.Select(d => d.Role);
但老实说,使用@awright18提到的GetUsersInRole方法可能更容易。