2011-06-15 38 views
1

如何根據User.IsInRole()在ASP.NET MVC中進行條件內容呈現?嘗試所有比賽,我可以在這裏找到,在SO但仍然不滿意。我需要隱藏操作鏈接根據用戶的角色,所以首先我想到了一個幫手像ASP.NET MVC中的LoginView控件模擬器MVC

public static MvcHtmlString ActionLink(this HtmlHelper html, string linkUrl, string linkText, object htmlAttributes, bool alwaysVisible, params string[] roles) 

,但後來我意識到,我經常需要隱藏在外含量過多(例如,<li></li>的菜單,在這裏我的鏈接被放入)。我遵循best practices建議,並有UrlHelperExtension所以我一般鏈接的樣子:

<a href="@Url.SomeStuff()">some stuff</a> 

,我不能嘗試的想法來實現輔助過RouteLink()將搶AuthorizeAttribute從適當的控制器方法可以我?你的解決方案是什麼?

回答

4

我傾向於使用的線沿線的東西:

@if (User.IsInRole("Role")) { 
<li> 
    <a href="@Url.SomeStuff()">Some stuff</a> 
<li> 
} 

這樣,如果需要,我可以有每個角色多個鏈接。

+0

呀,乍看上去簡單,但在大型應用程序,這將導致標籤湯。我們知道Rob Conery提出的建議 - 「如果有一個IF,就做一個助手」。 – UserControl 2011-06-15 11:42:10

+0

另一種方法是創建另一個幫助器,如ListItemActionLink,它調用您的自定義ActionLink幫助器,但只將結果字符串放入li標記(它的字符串爲空只是返回一個字符串)。更通用的方法是創建一個TagActionLink,您可以在其中傳遞標籤(如果需要,還可以使用html屬性)。這將給一個更清潔的佈局。 – lancscoder 2011-06-15 12:40:22

-3

另一種可能的方法是通過使用CSS來隱藏基於角色的隱藏元素,例如,

<li [email protected](User.IsInRole('role')?"showClass":"hideClass")> 
    <a href="@Url.SomeStuff()">Some stuff</a> 
<li> 

或者是一些與jQuery,如:

<li class="@User.Role")> 
     <a href="@Url.SomeStuff()">Some stuff</a> 
    <li> 

    $(document).ready(function() { 
     $(".SomeRole").hide() 
    } 
+0

Yuck,基於JavaScript的安全性,很容易被任何可以按F12或禁用JavaScript的人繞過。 – 2011-11-28 11:42:19