代码之家  ›  专栏  ›  技术社区  ›  Nate CSS Guy

基于当前用户的“角色”动态构建ASP.NET MVC母版页菜单

  •  15
  • Nate CSS Guy  · 技术社区  · 15 年前

    我也看到过一些类似的问题,但没有一个看起来像我要做的。

    这是我当前的实现,没有任何安全措施:

    <div id="menucontainer">
        <ul id="menu">              
            <li><%= Html.ActionLink("Main List", "Index", "AController")%></li>
            <li><%= Html.ActionLink("Product List", "Index", "BController")%></li>
            <li><%= Html.ActionLink("Company List", "Index", "CController")%></li>
            <li><%= Html.ActionLink("User List", "Index", "DController")%></li>
        </ul>
    </div>
    

    这很好,以上都可以。我对ccontroller和dcontroller的操作设置了[authorize]属性,以防止未经授权的访问--但是我想为没有正确角色的用户从菜单中删除这些项目,因为当他们看到并单击它,它会告诉他们没有权限,他们会想要它。如果他们不知道它在那里,那对所有参与的人都好…

    像这样的东西最终是我想要达到的目标,但是我在寻找更MVC风格的围裙,其中的“视图”是“愚蠢的”:

    <div id="menucontainer">
        <ul id="menu">              
            <li><%= Html.ActionLink("Main List", "Index", "AController")%></li>
            <li><%= Html.ActionLink("Product List", "Index", "BController")%></li>
            <% If(Role = Roles.Admin) { %>
            <li><%= Html.ActionLink("Company List", "Index", "CController")%></li>
            <li><%= Html.ActionLink("User List", "Index", "DController")%></li>
            <% } %>
        </ul>
    </div>
    
    6 回复  |  直到 11 年前
        1
  •  15
  •   saluce jkm    12 年前

    我做过类似的事情:

    • 为我的控制器使用公共基类(“层父类型”)。
    • 在BaseController中,重写OnActionExecuted(还可以为此定义ActionFilter属性)

    像这样:

        protected override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            // build list of menu items based on user's permissions, and add it to ViewData
            IEnumerable<MenuItem> menu = BuildMenu(); 
            ViewData["Menu"] = menu;
        }
    

    在母版页中:

        <% var model = ViewData["Menu"] as IEnumerable<MenuItem>; %>
        <% Html.RenderPartial("Menu", model); %>
    

    (注:实际上,我有一个MasterViewModel,其中包含菜单模型)

        2
  •  2
  •   Leniel Maccaferri    13 年前

    你听说了吗 MvcContrib 是MenuBuilder吗?

    如果没有,我建议你看看。示例项目 UI 是开始学习如何使用它的好方法。

        3
  •  2
  •   to StackOverflow    12 年前

    没人提到 MvcSiteMapProvider 这样就可以使用nuget轻松地集成到Visual Studio项目中。

        4
  •  1
  •   lopezbertoni    13 年前

    通常,我只是以与您类似的方式检查角色,然后用链接呈现局部视图或创建它们。像这样使用Razor语法。我使用t4mvc进行操作。

    @if(User.IsInRole("Admin"))
    {
        <li><a href="@Url.Action(MVC.Admin.User.Index())">Users</a></li>
    }
    

    为了安全起见,我使用了流畅的安全性。 希望这有帮助。

        5
  •  0
  •   Billy Coover    15 年前

    正如@sd所说,您可以创建一个“闪亮的”助手,根据您的安全要求,使用渲染链接或不渲染链接。

    下面是一篇关于自定义帮助器的好文章(在底部):

    understanding-html-helpers on S. Walther's blog

        6
  •  0
  •   Azerax    11 年前

    到目前为止,乔的解决方案是最简单的,对我很有效。我在不同的区域有页面,我需要快速设置一个菜单系统,根据用户所在的区域进行反应和工作。同样,在我的例子中,系统中没有跨区域链接,所以我们将转到下一个 configure multiple sitemaps for the MvcSiteMapProvider .

    希望这能帮助其他人寻找一个简单有效的解决方案!