如果请求的级别为"为空,则MvcSiteMapProvider呈现错误的级别"

时间:2014-08-14 18:14:30

标签: c# asp.net-mvc mvcsitemapprovider

我目前使用方法

渲染两级菜单
@Html.MvcSiteMap().Menu(2,1,true)

为第二级。

我认为我在这种情况下说的是“向我展示与当前路径相关的所有2级节点”。最后一个参数是“allowForwardSearch”,我不知道这意味着什么,我只知道如果我没有将它设置为true,我什么也得不到。

实际上,这会使第二级菜单正常,除非所有第二级节点都通过安全/可见性过滤器过滤掉,这将为第二级留下一个空的节点列表。如果预期结果是NO 2级节点,则它将呈现第1级节点。这会从第1级菜单中删除重复的项目。我希望它不会呈现任何东西,但事实并非如此。

这是一个错误,还是我需要使用特定的覆盖(有80个!)来让它在我要求第二级节点时不再显示我的第一级节点。

感谢。

1 个答案:

答案 0 :(得分:1)

这是一个现已在v4.6.13修复的错误。

如果您使用的是早期版本,则可以向您的用户可访问的SiteMap添加一个不可见的虚拟节点,这将覆盖此行为。

<mvcSiteMapNode title="Home" controller="Home" action="Index">
    <!-- Level 1 -->
    <mvcSiteMapNode title="About" controller="Home" action="About">
        <!-- Level 2 -->
        <mvcSiteMapNode title="About Me" controller="Home" action="AboutMe"/>
        <mvcSiteMapNode title="About You" controller="Home" action="AboutYou" />
        <mvcSiteMapNode title="Dummy Node" url="/dummy-url?id=1" visibility="!*" 
            visibilityProvider="MvcSiteMapProvider.FilteredSiteMapNodeVisibilityProvider, MvcSiteMapProvider" />
    </mvcSiteMapNode>
    <mvcSiteMapNode title="Contact" controller="Home" action="Contact"/>
</mvcSiteMapNode>

URL实际上不必存在,您只需指定它来覆盖虚拟节点的路由行为。如果您需要在多个地方执行此操作,您将需要多个虚拟URL(因为URL必须是唯一的) - 为此,我建议增加&#34; id&#34;查询字符串参数或以其他方式更改URL。

请注意,如果尚未将visibilityProvider配置为默认可见性提供程序,则只需明确指定visibilityProvider。

您所说的不可见性不正确 - 不会从SiteMap API中删除不可见的节点,只有不可访问的节点。因此,如果您在那里至少有一个不可见节点,当用户无法访问任何其他已配置节点时,菜单将不会切换到基于根节点。