2014-11-12 14 views
5

Come posso ottenere un elenco di utenti incluso il nome del ruolo per utente? La mia app ha le tabelle predefinite di un progetto MVC.Identità ASP.net 2.1 Ottieni tutti gli utenti con i ruoli

sono in grado di recuperare tutti gli utenti che utilizzano Identity 2.1 in questo modo:

Modello

public class GetVendorViewModel 
{ 
    public IList<ApplicationUser> Vendors { get; set; } 
} 

controller

public ActionResult Index() 
     { 

      var manager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())); 
      var roleStore = new RoleStore<IdentityRole>(ac); 
      var roleManager = new RoleManager<IdentityRole>(roleStore); 
      var vendor = roleManager.FindByName("Vendor").Users; 
      var model = new GetVendorViewModel { Vendors = vendor }; 
      return View("~/Views/User/Administrator/Vendor/Index.cshtml", model); 
     } 

in questo momento sta tornando questo:

[ 
    { 
     UserId: "4f9ed316-a852-45a9-93a8-a337a37b1c74", 
     RoleId: "a17bb59c-285a-43f9-b5ad-65f46f94bb4f" 
    } 
] 

Questo è corretto, ma ho bisogno di visualizzare le informazioni sull'utente, quali il nome, e-mail, nome utente ecc

Vorrei restituire un oggetto JSON come questo:

[ 
    { 
    UserId: "4f9ed316-a852-45a9-93a8-a337a37b1c74", 
    RoleId: "a17bb59c-285a-43f9-b5ad-65f46f94bb4f" 
    RoleName: "Administrator" 
    User: { 
      name:"Joe Doe", 
      email:"[email protected]", 
      ... 
      } 
    }, 
    { 
    ... 
    } 
] 

RoleName è nella tabella AspNetRoles.

UserId e RoleId sono query da AspNetUserRoles.

Eventuali indizi?

+0

DavidH, è necessario fornire parte del codice dell'app per ricevere una risposta adeguata. – carlodurso

risposta

9

L'elemento UserManager in Identity tende a confondere le persone. In ultima analisi, gli utenti sono ancora solo un DbSet sul contesto, in modo da poter utilizzare il contesto come query per qualsiasi altro oggetto:

var role = db.Roles.SingleOrDefault(m => m.Name == "role"); 
var usersInRole = db.Users.Where(m => m.Roles.Any(r => r.RoleId == role.Id)); 

EDIT dimenticata che IdentityUser.Roles riferimenti IdentityUserRole invece di IdentityRole direttamente. Quindi devi prima ottenere il ruolo, quindi utilizzare l'id del ruolo per eseguire una query nei tuoi utenti.

+3

Vorrei anche raccomandare di estendere UserManager per incapsulare questo metodo. –

+0

Buona idea. Se questo è qualcosa che si tende ad usare con qualsiasi frequenza, estendere decisamente 'UserManager'. –

+0

Chist Pratt, grazie. Il tuo suggerimento ha funzionato perfettamente. Sono nuovo di ASP.net MVC 5 È stupido pensare che ho passato quasi tutto il giorno a cercare una risposta a qualcosa di così semplice. Grazie ancora. – DavidH