需要了解如何获取/显示用户角色

我正在使用Identity 2学习MVC,我正在采取一个示例项目并调整它以适应我正在尝试使用ASP.Net成员资格提供程序从WebForms转换的网站。

我现在遇到的问题是如何从另一个表中获取值以填充类中的属性。

我有一个名为AppUser.cs的类,它inheritance自IdentityUser。 这基本上映射到使用EntityFramework的名为“AspNetUsers”的表。 我使用EF迁移向该表添加了更多属性(名/姓)。 现在,我想显示用户分配的角色,最终需要获取可用角色列表并将其添加到下拉列表中。 我将RoleName属性添加到我的AppUser类,但我假设因为该数据未存储在AspNetUsers表中,这就是为什么我收到错误“无效的列名’RoleName’”。

我如何填充角色和/或获取AppUser类中的可用角色列表,以便我可以在我的视图中显示它?

public class AppUser : IdentityUser { public string FirstName { get; set; } public string LastName { get; set; } public string RoleName { get; set; } } 

“Index.cshtml”视图上的模型是AppUser。

 @model IEnumerable 

这是我的Controller的ActionResult。

  public ActionResult Index() { return View(UserManager.Users); } private AppUserManager UserManager { get { return HttpContext.GetOwinContext().GetUserManager(); } } 

这是AppUserManager.cs

 using Microsoft.AspNet.Identity.Owin; using Microsoft.Owin; using SampleMvcSite.Models; namespace SampleMvcSite.Infrastructure { public class AppUserManager : UserManager { public AppUserManager(IUserStore store) : base(store) { } public static AppUserManager Create( IdentityFactoryOptions options, IOwinContext context) { AppIdentityDbContext db = context.Get(); AppUserManager manager = new AppUserManager(new UserStore(db)); manager.PasswordValidator = new CustomPasswordValidator { RequiredLength = 6, RequireNonLetterOrDigit = false, RequireDigit = false, RequireLowercase = true, RequireUppercase = true }; manager.UserValidator = new CustomUserValidator(manager) { AllowOnlyAlphanumericUserNames = true, RequireUniqueEmail = true }; return manager; } } } 

更新的代码:我最终创建了一个名为UserEditViewModel的类,我还包括我正在调整的示例项目中的AppRole类。

  public class UserEditViewModel : IdentityUser { public string FirstName { get; set; } public string LastName { get; set; } public string UserRole { get; set; } public IEnumerable AllRoles { get; set; } } public class AppRole : IdentityRole { public AppRole() : base() { } public AppRole(string name) : base(name) { } } 

然后在我的控制器中我做了以下事情。 请记住,我只允许一次将用户分配给一个角色,因此理论上应该只有一个角色,这就是我只调用userRoles [0]的原因。 由于我在一些示例用户之后添加了RoleManager,因此我有一些未分配给角色的用户。 我添加了一个检查以确保角色有计数,如果不是,我显示“用户”作为他们的角色。 如果没有找到任何角色,我将返回并添加代码以实际将用户添加到“用户”角色。

 List UserList = new List(); var users = UserManager.Users; foreach (AppUser user in users) { var userRoles = await UserManager.GetRolesAsync(user.Id); string roleName = userRoles.Count() == 0 ? "User" : userRoles[0]; UserEditViewModel editUser = new UserEditViewModel(); editUser.UserName = user.UserName; editUser.FirstName = user.FirstName; editUser.LastName = user.LastName; editUser.Email = user.Email; editUser.UserRole = roleName; editUser.AllRoles = RoleManager.Roles; UserList.Add(editUser); } return View(UserList); 

这是视图

 
@Html.DisplayNameFor(model => model.UserRole)

我会看一下ViewModels。 在视图中更新实体模型通常是不好的做法 – 尤其是与安全相关的实体。 请参阅https://www.stevefenton.co.uk/2013/03/Why-You-Never-Expose-Your-Domain-Model-As-Your-MVC-Model/

使用viewmodel,您可以拥有List的属性,该属性可以在控制器中填充并在视图中使用,而另一个属性如RoleId用于用户的角色。

在POST中,您可以执行以下操作:

 if (ModelState.IsValid) { var roleMgr = new RoleManager(new RoleStore(context)); var userMgr = new UserManager(new UserStore(context)); var role = roleMgr.FindById(viewmodel.RoleId); if (role != null) userMgr.AddToRole(viewmodel.UserId, role.Name); } 

视图:

 
@Html.LabelFor(model => model.RoleId)
@Html.DropDownListFor(model => model.RoleId, Model.RoleList, htmlAttributes: new { @class = "form-control" })
@Html.ValidationMessageFor(model => model.RoleId, "", new { @class = "text-danger" })