Ролевый контент asp.net mvc - PullRequest
5 голосов
/ 30 мая 2009

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

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

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

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

Ответы [ 4 ]

9 голосов
/ 30 мая 2009

Создайте помощник 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 helper. Пример для 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;
    }
}
3 голосов
/ 30 мая 2009

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

<% If (User.IsInRole("Administrator")) { %>
<div>Admin text</div>
<% } %>
1 голос
/ 27 ноября 2009

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

 <% MembershipUser mu = Membership.GetUser();
                    if (mu != null)
                        if (Roles.IsUserInRole(mu.UserName, "Administrator"))
                        {
                     %>
                <li class="paddingleftThree"><%= Html.ActionLink("User Administration", "GetUsers", "Account")%></li> <%} %>
0 голосов
/ 29 ноября 2013

Подход с разделением интересов, предложенный в ASP.NET MVC 4 Как вы работаете с различным HTML на основе ролей? , на мой взгляд, это лучший путь.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...