2016-12-04 2 views
0

J'essaie d'afficher une liste de rôles dans ma vue d'index mais il semble y avoir aucun moyen possible d'accéder à dbo.AspNetRoles ??Comment obtenir le nom des rôles dans les vues d'IdentityUser dans asp.net mvc?

RÔLE CONTRÔLEUR DE MAINTENANCE:

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); 
     } 
    } 
} 

APPLICATION UTILISATEUR MODÈLE

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; } 
    } 
} 

INDEX RÔLE DE MAINTENANCE VUE

@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> 

Je ne peux pas accéder à Roles.Name ou Roles.Id de item.Roles. J'ai essayé de créer une propriété virtual RoleNavigation dans l'utilisateur d'application, j'ai essayé de faire mon propre modèle IdentityRole.cs, j'ai essayé beaucoup de choses. Quelqu'un peut-il m'aider? Quand je lance ce code comme est que je reçois cette erreur:

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); 

Répondre

0

Lire cette première: http://www.c-sharpcorner.com/UploadFile/asmabegam/Asp-Net-mvc-5-security-and-creating-user-role/

Si vous avez fait quelque chose de semblable à ce alors ce est ce que je fais pour obtenir les rôles associés à un utilisateur et obtenir une liste de tous les rôles disponibles:

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"); 
    } 

Peut-être que ce code vous donnera quelques idées:) .... J'aurais dû créer un ViewModel pour contenir les résultats ... mais j'ai utilisé paresseusement ViewBag à la place.

Du côté de la vue, est le code ici qui a utilisé la liste:

 @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

Merci pour votre aide, mais je ne comprends tout simplement pas comment vous avez utilisé cette option conjointement avec votre point de vue? –