2016-12-04 86 views
0

我想显示在我的索引视图中的角色列表,但似乎没有可能的方式来访问dbo.AspNetRoles ??如何从asp.net mvc中的IdentityUser获取视图中的角色名称?

作用的维持控制:

namespace DwBusService.Controllers 
{ 
    public class DwRoleMaintenanceController : Controller 
    { 
     // private readonly ApplicationDbContext _context; 
     private readonly RoleManager<IdentityRole> roleManager; 
     private readonly UserManager<ApplicationUser> userManager; 

     public DwRoleMaintenanceController(RoleManager<IdentityRole> roleManager, UserManager<ApplicationUser> userManager) 
     { 
      this.roleManager = roleManager; 
      this.userManager = userManager; 
     } 

     // GET: DwRoleMaintenance 
     public async Task<IActionResult> Index() 
     { 
      var roles = roleManager.Roles.OrderBy(a => a.Name); 
      return View(roles); 
     } 
    } 
} 

应用的用户模型

namespace DwBusService.Models 
{ 
    // Add profile data for application users by adding properties to the ApplicationUser class 
    public class ApplicationUser : IdentityUser 
    { 
     public ApplicationUser() 
     { 
     } 
     [Display(Name = "Local Authentication")] 
     public bool LocalAuthentication { get; set; } 
    } 
} 

索引角色维护视图

@model IEnumerable<DwBusService.Models.ApplicationUser> 
.... 
<table class="table"> 
    <thead> 
     <tr> 
      <th>@Html.DisplayNameFor(model => model.Roles)</th> 
      <th></th> 
     </tr> 
    </thead> 
    <tbody> 
    @foreach (var item in Model) { 
     <tr> 
      <td>@Html.DisplayFor(modelItem => item.Roles)</td> 
      <td> 
       <a asp-action="Edit" asp-route-id="@item.Id">Edit</a> | 
       <a asp-action="Details" asp-route-id="@item.Id">Details</a> 
       <a asp-action="Delete" asp-route-id="@item.Id">Delete</a> 
      </td> 
     </tr> 
    } 
    </tbody> 
</table> 

我无法从item.Roles访问Roles.NameRoles.Id。我试图在应用程序用户中创建一个virtual RoleNavigation属性,我试图制作自己的IdentityRole.cs模型,我尝试了很多东西。谁能帮我?当我运行这段代码如我得到这个错误:

InvalidOperationException: The model item passed into the ViewDataDictionary is of type 'Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable'1[Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityRole]', but this ViewDataDictionary instance requires a model item of type 'System.Collections.Generic.IEnumerable'1[DwBusService.Models.ApplicationUser]'.

DBO.ASPNETROLES.SQL

CREATE TABLE [dbo].[AspNetRoles] (
    [Id]    NVARCHAR (450) NOT NULL, 
    [ConcurrencyStamp] NVARCHAR (MAX) NULL, 
    [NormalizedName] NVARCHAR (256) NULL, 
    CONSTRAINT [PK_AspNetRoles] PRIMARY KEY CLUSTERED ([Id] ASC) 
); 


GO 
CREATE NONCLUSTERED INDEX [RoleNameIndex] 
    ON [dbo].[AspNetRoles]([NormalizedName] ASC); 

回答

0

首先阅读:http://www.c-sharpcorner.com/UploadFile/asmabegam/Asp-Net-mvc-5-security-and-creating-user-role/

如果你已经做了一些与此类似,然后这个我正在做什么来获得与用户相关的角色,并获得所有可用角色的列表:

public ActionResult GetRoles(string UserName) 
    { 
     if (!string.IsNullOrWhiteSpace(UserName)) 
     { 
      Models.ApplicationUser user = context.Users.Where(u => u.UserName.Equals(UserName, StringComparison.CurrentCultureIgnoreCase)).FirstOrDefault(); 
      var account = new AccountController(HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>(), null); 

      ViewBag.RolesForThisUser = account.UserManager.GetRoles(user.Id); 

      // prepopulate roles for the view dropdown 
      var list = context.Roles.OrderBy(r => r.Name).ToList().Select(rr => new SelectListItem { Value = rr.Name.ToString(), Text = rr.Name }).ToList(); 
      ViewBag.Roles = list; 
     } 

     return View("ManageUserRoles"); 
    } 

也许这段代码会给你一些想法:)....我应该创建一个ViewModel来包含结果......但我懒洋洋地用ViewBag代替。

在视图方面,这里是使用列表中的代码:

 @Html.AntiForgeryToken() 
     @Html.ValidationSummary(true) 
     <div class="col-sm-6" > 
       <h3>Add Role to @Model.UserName</h3> 
       @Html.Hidden("UserID", Model.Id) 
      <span style="font-size:large">Role Name:</span> @Html.DropDownList("RoleName", (IEnumerable<SelectListItem>)ViewBag.Roles, "Select ...") 
      <input class="btn-sm btn-default" type="submit" value="Save" /> 
     </div> 
+0

谢谢你的帮助,但我根本不明白你如何与您的视图中使用这种结合? –

相关问题