Как скрыть вкладки на основе ролей, определенных в атрибутах в MVC3? - PullRequest
7 голосов
/ 02 сентября 2011

При установке веб-сайта MVC3 по умолчанию вкладки создаются в левом верхнем углу.Я хотел бы скрыть / показать эти вкладки в зависимости от того, будет ли текущий пользователь иметь доступ к индексу ViewResult.Разрешенные роли для ViewResult определяются атрибутами.Есть ли способ получить список ролей для ViewResult?

1 Ответ

10 голосов
/ 03 сентября 2011

Если вы спрашиваете (извините, мне не совсем ясно) об условном отображении HTML-элементов на основе ролей, вы могли бы сделать что-то вроде этого:

@if (User.IsInRole("Administrators"))
{
   @Html.ActionLink("Do Some Action", "DoAction", "SomeController")
}

Если вы не об этом, дайте мне знать.


Продолжение на основе вашего комментария:

Ваш вопрос меня интересует, и я немного покопался и обнаружил, что у Вивьен Шевалье есть интересная идея здесь , которая по сути позволяет вам написать что-то вроде этого:

@Html.ActionLinkAuthorized("The Privilege Zone", "ThePrivilegeZone", "Home", true)

в вашем View, а затем проверяет действие контроллера и либо отображает ссылку, либо нет.

В его примере с контроллером у вас есть такое действие:

[Authorize(Roles = "Administrator")]
public ActionResult ThePrivilegeZone()
{
    return View();
}

(Я думаю, ключевой момент здесь в том, что ваш View не знает приседаний об «Администраторах» и полагается на код расширения для выполнения тяжелой работы здесь:

public static MvcHtmlString ActionLinkAuthorized(
   this HtmlHelper htmlHelper, 
   string linkText, string actionName, string controllerName, 
   RouteValueDictionary routeValues, 
   IDictionary<string, object> htmlAttributes, bool showActionLinkAsDisabled)
{
   if (htmlHelper.ActionAuthorized(actionName, controllerName))
   {
      return htmlHelper.ActionLink(
         linkText, 
         actionName, controllerName, routeValues, htmlAttributes);
   }
   else
   {
      if (showActionLinkAsDisabled)
      {
         TagBuilder tagBuilder = new TagBuilder("span");
         tagBuilder.InnerHtml = linkText;
         return MvcHtmlString.Create(tagBuilder.ToString());
      }
      else
      {
         return MvcHtmlString.Empty;
      }
   }
}

Вместо того, чтобы вырезать / вставить весь этот код здесь, вы можете взглянуть на него и посмотреть пример приложения, которое он получил для этого. Я думаю, что особенно интересным для этого подхода является то, что представление может отображать эту ссылку PrivilegeZone, но знает только, что что-то еще определит, так ли это. Таким образом, предполагая, что вы получили новые требования, чтобы разрешить доступ к ссылке только людям, которые были «Администраторами» или «Владельцами», вы можете соответствующим образом изменить действие контроллера и не трогать код представления. Интересная идея, по крайней мере для меня.

...