#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
пространство имен.