1

I am using @model IEnumerable<WebApplication.Models.ApplicationUser>

View

@foreach (var user in Model)
{
    <tr>
        <td>
            @foreach(var role in user.Roles){
                role.Name; //invalid
                role.RoleId; //valid
                role.UserId; //valid
            }
        </td>
    </tr>
}

Model

public class ApplicationUser : IdentityUser
{
    [Required]
    public string FirstName { get; set; }

    [Required]
    public string LastName { get; set; }

    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
    {
        // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
        var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
        // Add custom user claims here
        return userIdentity;
    }
}

I can get RoleID and UserId from this role but how can I get Role.Name?

IdentityUser [from metadata]

namespace Microsoft.AspNet.Identity.EntityFramework
{
    // Summary:
    //     Default EntityFramework IUser implementation
    //
    // Type parameters:
    //   TKey:
    //
    //   TLogin:
    //
    //   TRole:
    //
    //   TClaim:
    public class IdentityUser<TKey, TLogin, TRole, TClaim> : IUser<TKey>
        where TLogin : global::Microsoft.AspNet.Identity.EntityFramework.IdentityUserLogin<TKey>
        where TRole : global::Microsoft.AspNet.Identity.EntityFramework.IdentityUserRole<TKey>
        where TClaim : global::Microsoft.AspNet.Identity.EntityFramework.IdentityUserClaim<TKey>
    {
        // Summary:
        //     Constructor
        public IdentityUser();

        // Summary:
        //     Used to record failures for the purposes of lockout
        public virtual int AccessFailedCount { get; set; }
        //
        // Summary:
        //     Navigation property for user claims
        public virtual ICollection<TClaim> Claims { get; }
        //
        // Summary:
        //     Email
        public virtual string Email { get; set; }
        //
        // Summary:
        //     True if the email is confirmed, default is false
        public virtual bool EmailConfirmed { get; set; }
        //
        // Summary:
        //     User ID (Primary Key)
        public virtual TKey Id { get; set; }
        //
        // Summary:
        //     Is lockout enabled for this user
        public virtual bool LockoutEnabled { get; set; }
        //
        // Summary:
        //     DateTime in UTC when lockout ends, any time in the past is considered not
        //     locked out.
        public virtual DateTime? LockoutEndDateUtc { get; set; }
        //
        // Summary:
        //     Navigation property for user logins
        public virtual ICollection<TLogin> Logins { get; }
        //
        // Summary:
        //     The salted/hashed form of the user password
        public virtual string PasswordHash { get; set; }
        //
        // Summary:
        //     PhoneNumber for the user
        public virtual string PhoneNumber { get; set; }
        //
        // Summary:
        //     True if the phone number is confirmed, default is false
        public virtual bool PhoneNumberConfirmed { get; set; }
        //
        // Summary:
        //     Navigation property for user roles
        public virtual ICollection<TRole> Roles { get; }
        //
        // Summary:
        //     A random value that should change whenever a users credentials have changed
        //     (password changed, login removed)
        public virtual string SecurityStamp { get; set; }
        //
        // Summary:
        //     Is two factor enabled for the user
        public virtual bool TwoFactorEnabled { get; set; }
        //
        // Summary:
        //     User name
        public virtual string UserName { get; set; }
    }
}
SMUsamaShah
  • 7,677
  • 22
  • 88
  • 131

3 Answers3

6

Only way I can find to get the role in razor Layout view is by getting UserManager from Request.

Razor View:

@using Microsoft.AspNet.Identity
@using Microsoft.AspNet.Identity.Owin;

@if (Request.IsAuthenticated) {
  var userManager = Request.GetOwinContext().GetUserManager<ApplicationUserManager>();
  var userRoles = userManager.GetRoles(User.Identity.GetUserId());
  var role = userRoles[0];
}
SMUsamaShah
  • 7,677
  • 22
  • 88
  • 131
1

If the type of role is IdentityUserRole from Microsoft.AspNet.Identity.EntityFramework then you will not have access to the role name. You can implement your own role from IdentityUserRole<TKey> and set the role name or load the role directly by querying the EF store.

Charlie Brown
  • 2,817
  • 2
  • 20
  • 31
  • I understand that this only has RoleId and UserId and that means that RoleName is stored somewhere else. "role name or load the role directly by querying the EF store" how and can I do that directly in the view? – SMUsamaShah Mar 05 '15 at 16:26
0

As an extension of Charlie's answer, one way you can do this is by getting a Roles collection and passing it in your view model.

@foreach (var user in Model)
{
    <tr>
        <td>
            @foreach(var role in user.Roles){
                Model.Roles.First(x=>x.RoleID == role.RoleID).Name;
                role.RoleId; //valid
                role.UserId; //valid
            }
        </td>
    </tr>
}
Inspector Squirrel
  • 2,548
  • 2
  • 27
  • 38