我做這樣的事情:添加元素,如果用戶在角色
<ul id="menu">
@if (HttpContext.Current.User.IsInRole("admin")) {
<li>@Html.ActionLink("Administration", "Index", "Administration")</li>
}
</ul>
有沒有更好的辦法?
我做這樣的事情:添加元素,如果用戶在角色
<ul id="menu">
@if (HttpContext.Current.User.IsInRole("admin")) {
<li>@Html.ActionLink("Administration", "Index", "Administration")</li>
}
</ul>
有沒有更好的辦法?
這當然是最短的路。它似乎你正在建立一個全球性的菜單,其鏈接只對某些用戶可見。你應該看看MvcContribs.UI.MenuBuilder
命名空間。
丹尼爾是正確的,有沒有辦法讓這個與現有的助手和方法更短,但如果你建立了很多菜單鏈接,他們都是非常相似的,你可以寫一個小幫手功能:
@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>
這些默認值有助於使事情變得更短,但如果你需要一個不同的訴權n在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>
不,我認爲這是最近的路。如果你有多個不同的「安全」鏈接,那麼你可以實現一個HtmlHelper的擴展,它檢查Actions上的AuthorizationAttribute,並且只在用戶有足夠的權限時才渲染。 – DanielB 2011-05-04 16:47:23
@DanielB嘿Dan,你爲什麼不把這個作爲答案? – Agzam 2011-05-04 22:04:36