0

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

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

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

<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>
4

1 回答 1

1

找到了绕过它的方法。它显然不是一种内置的扩展方法,或者至少我找不到。你可以打电话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,这意味着助手写入了一个空字符串

可能有一些技巧的组合,或者一个或两个重载,可以做到这一点,但我现在找不到。这适合我的需要(简单的顶部菜单)。必须有一种更简单的方法来做到这一点,使用通配符,或基于路线,进行最接近的匹配。我认为菜单是 web 应用程序的一个相当标准的部分,这将被覆盖 :)

于 2012-05-15T07:11:57.517 回答