Использование User.IsInRole() в представлении
В моем проекте mvc5, чтобы отключить ссылку действия для неавторизованных пользователей, я сделал это
@if (User.IsInRole("Admin") | User.IsInRole("Manager"))
{
@Html.ActionLink("Add New Record", "ProductTypeIndex", "ProductType")
}
Но если нужно проверить много ролей, тогда этот @if() будет длинным. Как этого избежать? Нужны ли мне специальные помощники для этого (если так, как я могу приблизиться к этому)? Помощь оценена..
2 ответа
Решение
Вы можете написать свой собственный метод расширения и использовать его в своем коде.
public static class PrincipalExtensions
{
public static bool IsInAllRoles(this IPrincipal principal, params string[] roles)
{
return roles.All(r => principal.IsInRole(r));
}
public static bool IsInAnyRoles(this IPrincipal principal, params string[] roles)
{
return roles.Any(r => principal.IsInRole(r));
}
}
Теперь просто вы можете вызвать этот метод расширения следующим образом:
// user must be assign to all of the roles
if(User.IsInAllRoles("Admin","Manager","YetOtherRole"))
{
// do something
}
// one of the roles sufficient
if(User.IsInAnyRoles("Admin","Manager","YetOtherRole"))
{
// do something
}
Хотя вы также можете использовать эти методы расширения в представлениях, но старайтесь по возможности избегать написания логики приложений в представлениях, поскольку представления не легко тестируются модулем.