我有一个带标准帐户控制器的常规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类我说组显然可以包含多个用户)。
现在,每个用户都必须处于特定角色。 (管理员,教师,学生等)
我已经通过以下在线教程添加了角色支持:
<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>
现在我想通过RoleName过滤所有用户。但我没有办法做到这一点
IE浏览器。这样的事情。 Users.Where(x=>x.RoleName=="Admin").Select(x=>x.FullName)
(Users
是类型ICollection<Users>
)的类的属性。如何在没有角色课程的情况下进入角色?
答案 0 :(得分:1)
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
答案 1 :(得分:0)
这是一个基于卢克建议的例子。
您的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”和“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模型添加新的导航属性,如下所示:
[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方法更容易。