【问题标题】:How to hide tabs based on roles defined in attributes in MVC3?如何根据 MVC3 中属性中定义的角色隐藏选项卡?
【发布时间】:2011-11-09 07:42:13
【问题描述】:

在 MVC3 网站的默认安装中,选项卡在左上角创建。我想根据当前用户是否有权访问索引 ViewResult 来隐藏/显示这些选项卡。 ViewResult 允许的角色由属性定义。有没有办法获取 ViewResult 的角色列表?

【问题讨论】:

  • 你的问题没有很好的解释,请问可以正常提问吗?

标签: asp.net asp.net-mvc-3 attributes roles


【解决方案1】:

如果您询问(抱歉,我并不清楚)关于基于角色的 HTML 元素的条件显示,您可以执行以下操作:

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

如果这不是你要问的,请告诉我。


根据您的评论跟进:

你的问题引起了我的兴趣,我仔细研究了一下,发现 Vivien Chevallier 有一个有趣的想法here,它基本上可以让你写出这样的东西:

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

在您的视图中,然后检查控制器操作并呈现链接或不呈现链接。

在他的控制器示例中,您有这样的操作:

[Authorize(Roles = "Administrator")]
public ActionResult ThePrivilegeZone()
{
    return 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 链接,但只知道其他东西将确定是否是这种情况。所以,假设你有新的要求,只允许“管理员”或“所有者”的人访问链接,你可以相应地修改控制器操作,而不是接触视图代码。有趣的想法,至少对我来说是这样。

【讨论】:

  • 抱歉问题写得不好。这几乎是我正在寻找的,除了声明一个角色(例如管理员)之外,是否可以通过操作属性获取已获得操作访问权限的角色列表?这样我就可以在属性中设置角色,并且链接将自动显示或不显示。
  • 这很有帮助。谢谢。
  • showActionLinkAsDisabled 设置为true 时,代码会丢弃htmlAttributes
  • @twnaing 在return 语句之前添加行tagBuilder.MergeAttributes(htmlAttributes);
  • 它应该返回一个空的a而不是span,所以它与预期的格式相匹配(特别是在链接的导航菜单中)
猜你喜欢
  • 1970-01-01
  • 2021-03-01
  • 1970-01-01
  • 2016-06-01
  • 2021-05-28
  • 2016-02-15
  • 1970-01-01
  • 2018-10-04
  • 1970-01-01
相关资源
最近更新 更多