2014-12-07 19 views
10

'daki rol adlarıyla kullanıcıları nasıl listeleyebilirim? ASP.NET MVC 5 web sitesinin varsayılan proje şablonuna sahibim ve tüm kullanıcıların rol adları (ID değil) ile listelenmeye çalışıyorum.ASP.NET MVC 5

sorgusu:

db.Users.Include(u => u.Roles).ToList() 

Sonra böyle bir şeyle rol isimleri yazdırmak istiyorum:

@string.Join(", ", user.Roles.Select(r => r.RoleId)) 

sorun olduğunu nerede Name ve sadece RoleId değil, Rol sınıfı ulaşabilir diğer özellikler saklanır.

Tüm rolleri almak için başka bir seçim yapabilir ve bunu bir arama olarak kullanabilirim. Veya doğrudan sorguya bir katılma yazabilirsiniz? Tabi ki, kullanıcıları ve rolleri bir araya getiren IdentityUserRole varlıkları ile tabloya erişimim olmadığından nasıl emin değilim.

sorunun kökü sadece RoleId ve UserId içeren IdentityUserRole (değil Role) Roller koleksiyonu olduğu gerçeğini gibi görünüyor.

public class IdentityUserRole<TKey> { 
    public virtual TKey RoleId { get; set; } 
    public virtual TKey UserId { get; set; } 
} 

Bir EF N-to-N ilişkisi yapmak istiyorsanız onlar Roles doğrudan koleksiyonu koymak ve daha sonra OnModelCreating geçersiz kılmak ve ilişkileri belirtmek gerektiğini düşündüm. Bu yaklaşım, nesnelerin birinden diğerine göz atmasını zorlaştırıyor gibi görünüyor.

Neden ek varlık olarak IdentityUserRole eklemeye karar verdiler? İlişkilere fazladan veri ekleyebilmek için? Kullanıcılardan rollere geçiş yapamamanın maliyeti ne kadar?

+0

Kullanıcıdan rollere kolayca gidebilir, çok sayıda ilişki olduğu için birleştirme tablosu var. Kimlik ekibinin sadece eğlence için bir çöp sistemi oluşturduğunu düşünmüyorum .... –

+0

@ No1_Melman Sorunun bir örneğini de ekleyebilir misiniz (belki cevap olarak)? Teşekkürler. – NightElfik

+0

Evet, bana bir dakika verin –

cevap

14

Bunu yapmak yoludur: (olmasa kullanıcı rollerini) rollerini sıralamak için RoleManager ve akıllı her şey kimlik doğrulaması için temelde UserManager:

using (var userManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationContext())) 
{ 
    var rolesForUser = await userManager.GetRolesAsync(userId); 

    // rolesForUser now has a list role classes. 
} 

kimlik takım iki yönetici yaptı. Aynı zamanda bir SignInManager da gerekli değil.

UserManager, kullanıcıları bulur, kullanıcı oluşturur, kullanıcıları siler, e-postalar gönderir .... liste uzayıp gider.

Yani benim Action aşağıdaki gibi görünebilir:

çıkışına dayanarak Varlık Çerçeve eşlenebildiğinden sınıf oluşturun:

public async Task<ActionResult> GetRolesForUser(string userId) 
    { 
     using (
      var userManager = 
       new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext()))) 
     { 
      var rolesForUser = await userManager.GetRolesAsync(userId); 

      return this.View(rolesForUser); 
     } 
    } 

o zaman böyle bir şey yapabilir ham SQL yürütmek için Sorgunuz:

public class UserWithRole 
{ 
    public string UserName {get;set;} // You can alias the SQL output to give these better names 
    public string Name {get;set;} 
} 

using (var context = new DbContext()) 
{ 
    var sql = @" 
       SELECT AspNetUsers.UserName, AspNetRoles.Name 
       FROM AspNetUsers 
       LEFT JOIN AspNetUserRoles ON AspNetUserRoles.UserId = AspNetUsers.Id 
       LEFT JOIN AspNetRoles ON AspNetRoles.Id = AspNetUserRoles.RoleId 
       WHERE AspNetUsers.Id = @Id"; 
    var idParam = new SqlParameter("Id", theUserId); 

    var result = context.Database.ExecuteQuery<UserWithRole>(sql, idParam); 
} 

Oldukça basit!

Eğer SQL dönüş sütunlarını diğer ad ise:

SELECT AspNetUSers.UserName, AspNetRoles.Name As RoleName 

Sonra DTO sınıfı şöyle olabilir:

belli ki çok daha temiz olduğunu
public class UserWithRole 
{ 
    public string UserName {get;set;} 
    public string RoleName {get;set;} 
} 

.

+0

Cevabınız için teşekkürler, ancak 'UserRoles' DbSet'ini nereden aldınız? Varsayılan olarak "IdentityDbContext", yalnızca "Roller" ve "Kullanıcılar" DbSet'leri vardır; – NightElfik

+0

Evet, bir projeye bir göz atmak için döndüm, ama hiçbir şey olmadığını buldum, ki bu garipti, çünkü tüm projelerimde bunu yapıyorum ama sanırım sebebini buldum! –

+0

@NightElfik şimdi bakın! –

0

C# uygulamanızdan dinamik SQL yürütmek için kötü tekniği bence.

Modeli:

public class ApplicationRole : IdentityRole 
    { 
    public ApplicationRole() : base() { } 
    public ApplicationRole(string name) : base(name) { } 
    public string Description { get; set; } 

    } 

Denetleyici:

using Microsoft.AspNet.Identity; 
using Microsoft.AspNet.Identity.Owin; 
using Microsoft.AspNet.Identity.EntityFramework; 
using System.Linq; 
using System.Net; 
using System.Threading.Tasks; 
using System.Web; 
using System.Web.Mvc; 
using System.Collections.Generic; 

//Example for Details. 
if (id == null) 
    { 
    return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
    } 
    var role = await RoleManager.FindByIdAsync(id); 
    // Get the list of Users in this Role 
    var users = new List<ApplicationUser>(); 

    // Get the list of Users in this Role 
    foreach (var user in UserManager.Users.ToList()) 
    { 
    if (await UserManager.IsInRoleAsync(user.Id, role.Name)) 
    { 
     users.Add(user); 
    } 
    } 

    ViewBag.Users = users; 
    ViewBag.UserCount = users.Count(); 
    return View(role); 

View (ApplicationRole kullanarak)

<div> 
     <h4>Roles.</h4> 
     <hr /> 
     <dl class="dl-horizontal"> 
      <dt> 
       @Html.DisplayNameFor(model => model.Name) 
      </dt> 
      <dd> 
       @Html.DisplayFor(model => model.Name) 
      </dd> 
     </dl> 
     <dl class="dl-horizontal"> 
      <dt> 
       @Html.DisplayNameFor(model => model.Description) 
      </dt> 
      <dd> 
       @Html.DisplayFor(model => model.Description) 
      </dd> 
     </dl> 
    </div> 
    <h4>List of users in this role</h4> 
    @if (ViewBag.UserCount == 0) 
{ 
     <hr /> 
     <p>No users found in this role.</p> 
} 
    <table class="table"> 
     @foreach (var item in ViewBag.Users) 
    { 
      <tr> 
       <td> 
        @item.UserName 
       </td> 
      </tr> 
    } 
    </table> 
3

budur Ben MVC 5 ile bunu nasıl, Kimlik Aşağıda benim yöntemidir 2.0 ve bir özel kullanıcı ve rol açıklamasını John Atten

denetleyici olarak

ViewModel

public class ListUserViewModel 
{ 
    public IList<YourAppNamespace.Models.ApplicationUser> users { get; set; } 
    public IList<string> roles { get; set; } 
} 

In And my View

public virtual ActionResult ListUser() { var users = UserManager.Users; var roles = new List<string>(); foreach (var user in users) { string str = ""; foreach (var role in UserManager.GetRoles(user.Id)) { str = (str == "") ? role.ToString() : str + " - " + role.ToString(); } roles.Add(str); } var model = new ListUserViewModel() { users = users.ToList(), roles = roles.ToList() }; return View(model); } 

@{ 
    int i = 0; 
} 
@foreach (var item in Model.users) 
{ 
    @Html.DisplayFor(modelItem => item.Name) 
    [... Use all the properties and formating you want ... and ] 
    @Model.roles[i] 
    i++; 
} 
0
using System.Linq; 
using System.Data; 
using System.Data.Entity; 

      var db = new ApplicationDbContext(); 
      var Users = db.Users.Include(u => u.Roles); 

      foreach (var item in Users) 
      { 
       string UserName = item.UserName; 
       string Roles = string.Join(",", item.Roles.Select(r=>r.RoleId).ToList()); 
      } 
0

Cevabınız için @Callum Linington'a teşekkürler. Sadece benim gibi yeni başlayanlar için biraz netleştirmeye çalışın. Kullanıcıların rollerine sahip bir listesini almak için adımlar. Aşağıda gösterildiği gibi

1-

bazı özelliklere sahip "UsersWithRoles" adı verilen bir görünüşüdür modeli oluşturmak:

enter image description here

2- "RolesController" olarak adlandırılan bir kontrolör oluşturmak ve sonra bu kod birim aşağıdakileri ekleyin. enter image description here

3-

Roller klasörüne Endeksi sayfasını ekleyin ve aşağıdaki kodu ekleyin: Burada

 public ActionResult Index() 
    { 
     using (var context = new ApplicationDbContext()) 
     { 
      var sql = @" 
      SELECT AspNetUsers.UserName, AspNetRoles.Name As Role 
      FROM AspNetUsers 
      LEFT JOIN AspNetUserRoles ON AspNetUserRoles.UserId = AspNetUsers.Id 
      LEFT JOIN AspNetRoles ON AspNetRoles.Id = AspNetUserRoles.RoleId"; 
      //WHERE AspNetUsers.Id = @Id"; 
      //var idParam = new SqlParameter("Id", theUserId); 

      var result = context.Database.SqlQuery<UserWithRoles>(sql).ToList(); 
      return View(result); 
     } 

    } 

ve RolesController gibi görünmelidir şeydir. İşte

@model IEnumerable<MVC_Auth.ViewModels.UserWithRoles> 
 
<div class="row"> 
 
    <h4>Users</h4> 
 
    <table class="table table-hover table-responsive table-striped table-bordered"> 
 
     <th>User Name</th> 
 
     <th>Role</th> 
 
     @foreach (var user in Model) 
 
     { 
 
      <tr> 
 
       <td>@user.UserName</td> 
 
       <td>@user.Role</td> 
 
      </tr> 
 
     } 
 
    </table> 
 
</div>

sonuç

enter image description here

teşekkürler olduğunu.