【问题标题】:asp.net MVC3 razor: display actionlink based on user roleasp.net MVC3 razor:根据用户角色显示操作链接
【发布时间】:2011-10-22 08:24:18
【问题描述】:

我是 MVC 的新手。我希望能够为某些用户隐藏一些操作链接。假设我有一个“创建”操作链接,我只希望管理员查看并单击它。我想使用 asp.net 中提供的某种“loggedintemplate”,但它似乎不适用于 razor。

我可以使用某种带有 if 语句的代码块来检查当前用户及其角色,但这可能不是最佳做法?

我的 index.cshtml..

// want some adminauth attribute here...
@Html.ActionLink("Create New", "Create")

我的控制器..

// GET: /Speaker/Create
[Authorize(Roles = "Administrators")]
public ActionResult Create()
{
    return View();
}

【问题讨论】:

    标签: c# asp.net-mvc-3 razor


    【解决方案1】:

    您可以在 App_Code/ViewFunctions.cshtml 中添加一个函数(如果缺少则创建)

    @using System.Web.Mvc;
    @functions{
    public static object ConditionalActionLink(object actionLink, ICollection<string> arrAuthUsers)
    {
        bool objIsVisible = arrAuthUsers
            .Select(s => User.IsInRole(s))
            .Where(s => s.Equals(true))
            .Any();
    
        return (objIsVisible)
            ? actionLink
            : MvcHtmlString.Empty;
    }
    

    要使用该功能,只需将以下代码添加到视图中。

    @ViewFunctions.ConditionalActionLink(
    @Html.ActionLink("TextToDisplay", "SomeAction", new { Area = "SomeArea", Controller = "SomeController" }), 
    new string[] { "administrator","jDoe", "someOtherUser" })
    

    【讨论】:

      【解决方案2】:

      如果您还没有启用roleManager,并且您仍然想检查用户的角色,您可以这样做:

       @if (@User.IsInRole("administrator"))
       {
         @Html.ActionLink("Create New Version", "Create")
       }
      

      我们在这里所做的是,我们只是在访问用户的属性。如果您自己管理角色,这会很有用。

      【讨论】:

        【解决方案3】:

        我过去创建了一个辅助函数,仅在满足以下条件时才返回输出:

        public static MvcHtmlString If(this MvcHtmlString value, bool evaluation)
        {
             return evaluation ? value : MvcHtmlString.Empty;
        }
        

        所以你可以使用这个:

        @Html.ActionLink("Create New", "Create").If(User.IsInRole("Administrators"))
        

        这样它既清晰又简短

        【讨论】:

        • 我已将 String.Empty 转换为 MvcHtmlString 以改用 MvcHtmlString.Empty。
        • @Neel 创建文件夹Helpers 并添加静态帮助类并将这段代码放在那里。然后在顶部的 cshtml 中放置 @using Helpers.YourClass
        • 哦,差不多是 3 年前了,现在我什至不记得我在哪里使用这个 @Dimi :P 但无论如何谢谢 :)
        【解决方案4】:

        我已经修改了 Richard 的代码,以提供一个可选的 MvcHtmlString 参数,以便在评估结果为 false 时返回。

        public static MvcHtmlString If(this MvcHtmlString value, bool evaluation, MvcHtmlString falseValue = default(MvcHtmlString))
                {
                    return evaluation ? value : falseValue;
                }
        

        【讨论】:

          【解决方案5】:

          Richard 提出的解决方案非常漂亮,尽管正如 Matthieu 指出的那样,有人可能还需要额外的 html 代码来呈现(或不呈现)。 因此,Matthieu 的解决方案似乎更广泛适用,我只是将关于哪些用户被视为管理员的逻辑集中在扩展方法中。

          扩展方法:

          public static bool IsAdmin(this WebViewPage page)
          {
              return page.User.IsInRole(@"Domain\ProjectAdmins");
          }
          

          用法:

          @if (this.IsAdmin())
          {
              <p>
                  @Html.ActionLink("Create New Version", "Create")
              </p>
          }
          
          【解决方案6】:

          如果您想要一个代码块,可以在视图中执行:

          @if (Roles.IsUserInRole("Administrators"))
          {
            <li>@Html.ActionLink("Create New", "Create")</li>
          }
          

          【讨论】:

          • Matthieu,我通常也会采用这种方法。查看 Richard 的回复。
          • @Kristofer :在某些情况下,您可能希望使用块结构来避免 html 挂起。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-01-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-11-11
          相关资源
          最近更新 更多