如果用户在角色中,则添加元素

时间:2011-05-04 16:38:34

标签: asp.net-mvc-3

我这样做:

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

有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

Daniel是正确的,现有的帮助器和方法没有办法缩短它,但是如果你构建了很多菜单链接并且它们都非常相似,那么你可以编写一个小辅助函数:

@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>

答案 1 :(得分:1)

这当然是最短的方式。它似乎正在构建一个全局菜单,其链接仅对某些用户可见。您应该查看MvcContribs.UI.MenuBuilder命名空间。

http://mvccontrib.codeplex.com/