Добавление элемента, если пользователь находится в роли

#asp.net-mvc-3

#asp.net-mvc-3

Вопрос:

Я делаю что-то подобное:

  <ul id="menu">
     @if (HttpContext.Current.User.IsInRole("admin")) {
         <li>@Html.ActionLink("Administration", "Index", "Administration")</li>
    }
 </ul>
  

Есть ли способ лучше?

Комментарии:

1. Нет, я думаю, что это самый короткий путь. Если у вас есть несколько разных «безопасных» ссылок, то вы могли бы реализовать расширение для HtmlHelper, которое проверяет наличие атрибута AuthorizationAttribute для действий и отображает только в том случае, если у пользователя достаточно разрешений.

2. @DanielB эй, Дэн, почему бы тебе не использовать это в качестве ответа?

Ответ №1:

Дэниел прав, что нет способа сократить это с помощью существующих помощников и методов, но если вы создаете много ссылок меню, и все они очень похожи, вы могли бы написать небольшую вспомогательную функцию:

 @helper MenuLink(string linkText, string action = "Index", string controller = null)
{
    <li>@Html.ActionLink(linkText, action, controller ?? linkText.Replace(" ", string.Empty))</li>
}
  

Теперь ваш код выглядит следующим образом:

 <ul id="menu">
    @if (HttpContext.Current.User.IsInRole("admin")) {
        @MenuLink("Administration")
    }
</ul>
  

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

 @MenuLink("Admin reports", "Admin", "Reports")
  

Идя дальше, я использую пару методов расширения, которые сделают это еще короче:

 public static class HtmlStringConditionalExtensions
{
    public static IHtmlString If(this IHtmlString value, bool evaluation)
    {
        return evaluation ? value : MvcHtmlString.Empty;
    }

    public static IHtmlString ForRoles(this IHtmlString value, params string[] roles)
    {
        return value.If(roles.Any(HttpContext.Current.User.IsInRole));
    }
}
  

И теперь вы можете написать:

 <ul id="menu">
    @MenuLink("Administration").ForRoles("admin")
</ul>
  

Ответ №2:

Это, конечно, самый короткий путь. Кажется, вы создаете глобальное меню со ссылками, видимыми только для определенных пользователей. Вам следует взглянуть на MvcContribs.UI.MenuBuilder пространство имен.

http://mvccontrib.codeplex.com/