我这样做:
<ul id="menu">
@if (HttpContext.Current.User.IsInRole("admin")) {
<li>@Html.ActionLink("Administration", "Index", "Administration")</li>
}
</ul>
有更好的方法吗?
答案 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
命名空间。