当当前操作未在 MVC.sitemap 文件中列出时,是否可以强制站点地图控件呈现菜单?
我有一个简单的顶部导航。 当当前操作位于站点地图中时,对.Menu()
的调用将呈现正确的<ul><li>..
数据。 但是,如果我到达了一个不在站点地图中的页面,例如/Home/Login,那么它根本不会呈现任何 html(甚至没有评论,只是空白(。 这不是一个[authorize]
问题;当我在"/主页/索引"中时,菜单很好。
似乎它应该呈现请求的内容,但不设置IsCurrentNode
和IsNodeInPath
属性。 这是我打的电话
<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,这意味着帮助程序写入一个空字符串
可能会有技巧的组合,或者一两个超载,可以巧妙地做到这一点,但我现在找不到它。 这适用于我的需求(简单的顶部菜单(。 必须有一种更简单的方法来做到这一点,使用通配符或基于路由的东西,进行最接近的匹配。 我认为菜单是网络应用程序中相当标准的一部分,这将涵盖:)