ASP.NET MVC 3: Отображение ActionLink в зависимости от роли пользователя

ru-RU | создано: 04.06.2011 | опубликовано: 04.06.2011 | обновлено: 29.12.2017 | просмотров за всё время: 12762

ActionLink рисует html-ссылку на конкретный ActionResult. Задался вопросом: А что если должна быть видно только пользователю, у которого есть определенная роль? Например, пользователь с правами “администратора” может видеть эту ссылку, а с правами “блоггера” – нет? Оказалось ничего сложного, просто написал расширение для HtmlHelper.

Расширяем HtmlHelper

Создаем класс HtmlExtentions, в который будем писать своё расширение для HtmlHelper и пишем само расширение:

public static class HtmlExtentions
{
    #region Admin Links
    /// <summary>
    /// Рисует ссылку если у пользователя есть роль
    /// </summary>
    /// <param name="html">htmlHelper</param>
    /// <param name="requiredRoleName">название роли</param>
    /// <param name="text">текст ссылки</param>
    /// <param name="actionName">название ActionResult</param>
    /// <param name="controllerName">название Controller</param>
    /// <returns>secure ActionLink</returns>
    public static MvcHtmlString SUAdminLinkAction(this HtmlHelper html, 
               string requiredRoleName, string text, 
               string actionName, string controllerName)
    {
        string htmlstring = string.Empty;
        HttpContext context = HttpContext.Current;
        MvcHandler handler = context.Handler as MvcHandler;
        if (handler.RequestContext.HttpContext.User.Identity.IsAuthenticated)
        {
            if (handler.RequestContext.HttpContext.User.IsInRole(requiredRoleName))
            {
                var url = new UrlHelper(html.ViewContext.RequestContext);
                var tagBuilder = new TagBuilder("a");
                tagBuilder.SetInnerText(text);
                tagBuilder.MergeAttribute("href", 
                                 url.Action(actionName, controllerName));
                htmlstring = tagBuilder.ToString(TagRenderMode.Normal);
            }
        }
        return MvcHtmlString.Create(htmlstring);
    }
    #endregion
}

Если у Вас возникнут вопросы, то я с радостью отвечу на них. А также принимаются рекомендации и замечания, дополнения и здоровая критика в комментарии. Дело в том, что я в MVC новичок и готов учиться.

Комментарии к статье (1)

28.01.2012 18:33:00 Сергей

Спасибо, пригодилось. Добавил только несколько ролей для доступа к ссылке.