2009-05-30 2 views
4

Я хочу отображать контент в зависимости от заданной роли (ов) активного пользователя в ASP.NET MVC.Содержание на основе роли asp.net mvc

Сравните старый способ моды, с использованием WebForms:

protected void Page_Load(Object sender, EventArgs e) 
{ 
    if(User.IsInRole("Administrator")) { 
     adminLink.Visible = true; 
    } 
} 

Теперь, как я пошел бы писать, что при использовании ASP.NET MVC? С моей точки зрения было бы неправильно размещать его непосредственно в файле просмотра, и назначение переменной для каждого отдельного представления тоже будет неважно.

ответ

8

Создать помощник Html и проверить текущие роли пользователей в коде:

public static class Html 
{ 
    public static string Admin(this HtmlHelper html) 
    { 
     var user = html.ViewContext.HttpContext.User; 

     if (!user.IsInRole("Administrator")) { 
      // display nothing 
      return String.Empty; 

      // or maybe another link ? 
     } 

     var a = new TagBuilder("a"); 
     a["href"] = "#"; 
     a.SetInnerText("Admin"); 

     var div = new TagBuilder("div") { 
      InnerHtml = a.ToString(TagRenderMode.Normal); 
     } 

     return div.ToString(TagRenderMode.Normal); 
    } 
} 

ОБНОВЛЕНО:

Или создать обертку для хранения Html помощник. Пример ActionLink (это HtmlHelper HtmlHelper, струнный LinkText, струнный ActionName, строка controllerName):

public static class Html 
{ 
    public static string RoleActionLink(this HtmlHelper html, string role, string linkText, string actionName, string controllerName) 
    { 
     return html.ViewContext.HttpContext.User.IsInRole(role) 
      ? html.ActionLink(linkText, actionName, controllerName) 
      : String.Empty; 
    } 
} 
+0

Интересно. Возможно, я мог бы создать перегрузку для стандартных компонентов html или похожих. Нравится: Html.ActionLink (...). ТребоватьRole («Admin») Все, что угодно, но если бы/else-заявления по всему месту были бы лучшим решением. –

+0

Я думаю, что лучше создавать обертки для существующих помощников Html. –

+0

Я думаю, вы должны обновить метод RoleActionLink', чтобы использовать 'MvcHtmlString' вместо' String'. –

3

Нет, вы бы поместить его в файл вида, как и на самом деле:

<% If (User.IsInRole("Administrator")) { %> 
<div>Admin text</div> 
<% } %> 
+1

Я думаю, что Клаус прав, чтобы сказать, что эта логика не принадлежит к виду. Конечно, это работает, но ваш код становится очень незаметным. –

+0

Согласен, однако это действительно зависит от количества кода, который должен быть скрыт для администраторов. Извлечение одного блока в результат действия может фактически сделать его менее читаемым ... – Ropstah

+0

yep достаточно справедливо :) –

1

это работало для меня:

<% MembershipUser mu = Membership.GetUser(); 
        if (mu != null) 
         if (Roles.IsUserInRole(mu.UserName, "Administrator")) 
         { 
        %> 
       <li class="paddingleftThree"><%= Html.ActionLink("User Administration", "GetUsers", "Account")%></li> <%} %> 
0

Разделение проблем подхода, предложенного в ASP.NET MVC 4 How do you serve different HTML based on Role? на мой взгляд, является лучший способ пойти.

Лично я избегаю IsInRole проверять как можно больше кода и оставлять его декларативным средством для максимально возможного ограничения роли. Это гарантирует, что код будет сохраняться с течением времени. Я не уверен, что это правильный или неправильный подход, но я хорошо работал для меня.

Смежные вопросы