【问题标题】:Make MVC sitemap send only relevant nodes to visibility provider使 MVC 站点地图仅将相关节点发送给可见性提供者
【发布时间】:2016-02-09 15:56:04
【问题描述】:

几天前我开始使用 MVC 站点地图提供程序。 我的主要目标是创建 2 个菜单(主菜单和侧菜单),并且这些菜单中的每一个都迭代它们的节点并根据特定的业务逻辑切换可见性。

为了使用我自己的可见性逻辑,我使用了this 文章。

我的布局页面包含以下几行:

@Html.MvcSiteMap().Menu(new { name = "MainMenu" })
@Html.MvcSiteMap().Menu(new { name = "SideMenu" })

在当前情况下,这两行中的每一行都会遍历 Mvc.sitemap 中指定的所有节点,我需要先检查它们是否属于主菜单或侧面菜单,然后继续以我的逻辑。 我假设有一种方法可以在这两个菜单之间划分节点,并跳过检查是否从其发送节点的菜单名称的部分。

有什么建议吗?

谢谢

【问题讨论】:

    标签: asp.net-mvc menu mvcsitemapprovider


    【解决方案1】:

    FilteredSiteMapNodeVisibilityProvider 之外不存在“命名的 HTML 助手”的概念。如果您创建自定义提供程序,则需要在运行自定义逻辑之前检查您所在的菜单 (just like in FilteredSiteMapNodeVisibilityProvider)。

    但这并不意味着您不能将可见性提供程序中的代码组织成单独的部分。

    【讨论】:

    • 当然,我在 IsVisible 方法中组织了我的代码。首先,我检查生成节点的名称,然后才调用我的可见性逻辑。但这听起来很奇怪,如果有一个选项可以在布局文件中创建多个菜单,每个菜单描述不同的菜单,为什么没有办法将每个菜单实例路由到 mvc.sitemap 文件中的其他节点?跨度>
    • 我不明白这个问题。 “将每个菜单实例路由到其他节点”是什么意思?每个菜单只是同一个站点地图的不同视图。请注意,如果您使用不同的菜单 HTML 帮助程序模板,则不一定需要使用可见性提供程序,因为您可以将可见性逻辑直接放在每个模板中。在这种情况下,如果您在/Views/Shared/DisplayTemplates/MainMenu.cshtml 有一个菜单模板文件,您将指定@Html.MvcSiteMap().Menu("MainMenu")
    • 场景是我正在创建一个网站,供我公司的内部用户使用。它将包括一个顶部菜单,单击某个链接将打开一个带有相关菜单项的左侧菜单。可见性问题是主菜单和侧菜单都将根据当前经过身份验证的用户显示/隐藏项目。我知道如何实现可见性部分,但不确定如何划分这两个菜单,实际上我希望每个菜单都与另一个站点地图链接。此外,侧边菜单是动态的,应根据当前主菜单选择包含项目。
    • 在这种情况下,您应该使用security trimming,它会根据AuthorizeAttribute 自动控制节点的可见性。这将确保您的节点不仅不可见,而且用户也无法访问 URL(因为AuthorizeAttribute 会阻止它们)。
    • 请注意,您可以在使用可见性的同时使用安全修整。因此,您可以使用FilteredSiteMapNodeVisibilityProvider 来显示/隐藏主菜单和侧菜单中的每个节点,并使用安全修剪来隐藏当前用户无权访问的那些节点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    • 2023-04-02
    • 2015-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多