Использование 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
} 

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

<% if (Page.User.IsInRole("Admin")){ %>
Другие вопросы по тегам