2014-09-28 3 views
0

У меня 3 роли в моем webapp: Admin, Moderator, User.Как проверить вид Razor, если ApplicationUser.Roles содержит определенную роль?

У меня есть пользователь @model WebApplication2.Models.ApplicationUser Я хочу проверить внутри Razor, если user.Roles содержит роль Moderator. Как это сделать? Я попробовал @if(@Model.Roles.Contains(DON'T_KNOW_WHAT_TO_WRITE_HERE){}.

ПРИМЕЧАНИЕ: Я не спрашиваю, как проверить, принадлежит ли в данный момент уполномоченный пользователь.

+0

Что такое 'Model.Roles'? –

+0

@AntP 'Model.Roles' является свойством' ApplicationUser', он был навязан стандартным шаблоном в ASP.NET MVC 5 (в старых версиях авторизация была выполнена по-другому). Это свойство было создано Visual Studio при создании нового проекта с индивидуальными учетными записями. – Yoda

ответ

-1

Почему бы вам просто не распечатать их, чтобы просмотреть возможные значения?

Ваш код, кажется, имеет незначительную ошибку. Я считаю, что это должно быть

@if(Model.Roles.Contains(DON'T_KNOW_WHAT_TO_WRITE_HERE){} 

(только один «@»)

EDIT: Поскольку Model.Roles являются просто многие-ко-многим ссылки, вам необходимо позвонить UserManager для получения ролей пользователей. Например:

public class UserDetailsModel { 
    public string Id { get; set; } 
    public ApplicationUser User { get; set; } 
    public IList<string> Roles { get; set; } 
} 

и детали действия в контроллере:

public ActionResult Details(string id) { 
     var model = new UserDetailsModel 
     { 
      Id = id, 
      User = UserManager.FindById(id), 
      Roles = UserManager.GetRoles(id) 

     }; 
     return View(model); 
    } 

Вы можете получить UserManager от OwinContext или вводить его в контроллер:

private readonly ApplicationUserManager _userManager; 
    public UsersController(){} 
    public UsersController(ApplicationUserManager userManager) { 
     _userManager = userManager; 
    } 
    public ApplicationUserManager UserManager { 
     get { 
      return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>(); 
     } 
    } 
+0

Содержит метод equals, и ему нужен экземпляр Role, чтобы дать ответ, знаете ли вы, какой объект должен пройти? – Yoda

+0

Если вам нужно проверить, находится ли пользователь в роли, используйте 'UserManager.IsInRole (id,« Admin »)' – cyberhubert

2

Что вы могли бы сделать, это создать расширение метод на IPrincipal, который действует так же, как User.IsInRole(...)

public static bool IsInAppRole(this IPrincipal user, string role) 
{ 
    using(var db = new MyEntities()) 
    { 
     var dbUser = db.Users.Find(user.Identity.GetUserId()); 
     return dbUser.Roles.Any(r => r.RoleName == role) 
    } 
} 

расширения импорт в целях

@using MyApplication.Web.Extensions 

использования, как бы вы IsInRole()

@if(User.IsInAppRole("Admin")) 
{ 
} 

Хотя, не знаю, почему вы могли бы сделать это в качестве роли пользователя может быть введен в их объект Identity.

1

Самый простой способ, который я мог бы найти это использовать:

@Model.Roles.SingleOrDefault().RoleId 

Это, конечно, требует, чтобы работать с идентификатором, а не именем в сравнении. Без создания новой ViewModel я не нашел хорошего способа получить прямой доступ к названию.

EDIT: Если несколько ролей назначены, вы должны быть в состоянии сделать что-то вроде этого:

@{ 
    var isMod = false; 
} 
foreach (var r in Model.Roles) 
{ 
    if(r.RoleId == "1") 
    { 
     isMod = true; 
    } 
} 
0

Я думаю, что вы должны использовать User.IsInRole(...) в вашем представлении кода

Смежные вопросы