2011-05-04 43 views
0

我做這樣的事情:添加元素,如果用戶在角色

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

有沒有更好的辦法?

+3

不,我認爲這是最近的路。如果你有多個不同的「安全」鏈接,那麼你可以實現一個HtmlHelper的擴展,它檢查Actions上的AuthorizationAttribute,並且只在用戶有足夠的權限時才渲染。 – DanielB 2011-05-04 16:47:23

+0

@DanielB嘿Dan,你爲什麼不把這個作爲答案? – Agzam 2011-05-04 22:04:36

回答

1

這當然是最短的路。它似乎你正在建立一個全球性的菜單,其鏈接只對某些用戶可見。你應該看看MvcContribs.UI.MenuBuilder命名空間。

http://mvccontrib.codeplex.com/

2

丹尼爾是正確的,有沒有辦法讓這個與現有的助手和方法更短,但如果你建立了很多菜單鏈接,他們都是非常相似的,你可以寫一個小幫手功能:

@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> 
相關問題