当当前操作不在 Mvc.sitemap 文件中时,MVC 站点地图呈现为空



当当前操作未在 MVC.sitemap 文件中列出时,是否可以强制站点地图控件呈现菜单?

我有一个简单的顶部导航。 当当前操作位于站点地图中时,对.Menu()的调用将呈现正确的<ul><li>..数据。 但是,如果我到达了一个不在站点地图中的页面,例如/Home/Login,那么它根本不会呈现任何 html(甚至没有评论,只是空白(。 这不是一个[authorize]问题;当我在"/主页/索引"中时,菜单很好。

似乎它应该呈现请求的内容,但不设置IsCurrentNodeIsNodeInPath属性。 这是我打的电话

<div id="main-nav">
    @Html.MvcSiteMap().Menu(0, true, true, 1)
</div>

Mvc.sitemap 文件:

<mvcSiteMapNode title="Home" controller="Home" action="Index">
    <mvcSiteMapNode title="Form New Human" controller="Person" action="Create"/>
    <!-- there is no mvcSiteMapNode for "Home" "Login" -->
</mvcSiteMapNode>
找到了

解决方法。 它显然不是一个内置的扩展方法,或者至少我找不到一个。 您可以调用Html.MvcSitemap().Menu(Html.MvcSiteMap.Provider.RootNode,...)但我不想实例化帮助程序两次。

<div id="main-nav">
@{
    var sm = Html.MvcSiteMap();
    @sm.Menu(sm.Provider.RootNode, true, true, 2);  // 2 levels (home, plus main nav)
}
</div>

在反汇编中环顾四周似乎表明它的工作原理有点像这样:

  • 真的需要一个起始节点
  • 如果你不给它一个,它会尝试根据当前节点找到一个
    • 加上限制(前向搜索、深度限制等(
    • 如果你想要级别 1 的节点,你必须知道你处于哪个级别
  • 由于返回 null,因此起始节点为 null,这意味着帮助程序写入一个空字符串

可能会有技巧的组合,或者一两个超载,可以巧妙地做到这一点,但我现在找不到它。 这适用于我的需求(简单的顶部菜单(。 必须有一种更简单的方法来做到这一点,使用通配符或基于路由的东西,进行最接近的匹配。 我认为菜单是网络应用程序中相当标准的一部分,这将涵盖:)

相关内容

  • 没有找到相关文章