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

Razor 当当前操作不在MVC.Sitemap文件中时,MVC站点地图呈现为空,razor,asp.net-mvc-4,sitemapprovider,Razor,Asp.net Mvc 4,Sitemapprovider,当MVC.sitemap文件中未列出当前操作时,是否可以强制sitemap控件呈现菜单 我有一个简单的顶部导航。当当前操作在站点地图中时,调用.Menu()将呈现正确的。数据。但是,如果我访问了一个不在站点地图中的页面,比如/Home/Login,那么它将根本不会呈现任何html(甚至没有注释,只是空白)。这不是[authorize]问题;当我在'/Home/Index'时,菜单很好 它似乎应该呈现请求的内容,但不设置IsCurrentNode和IsNodeInPath属性。这是我的电话 <

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

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

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

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

@Html.MvcSiteMap()菜单(0,true,true,1)
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>

@{
var sm=Html.MvcSiteMap();
@sm.Menu(sm.Provider.RootNode,true,true,2);//2级(主导航加主导航)
}
在拆解过程中环顾四周,似乎可以看出它的工作原理有点像这样:

  • 您确实需要一个起始节点
  • 如果您不给它一个,它将尝试基于当前节点查找一个
    • 加上限制(正向搜索、深度限制等)
    • 如果希望节点来自级别1,则必须知道所处的级别
  • 因为它返回null,所以起始节点为null,这意味着帮助器写入一个空字符串
可能有一些技巧的组合,或者一两个超负荷,这都可以被欺骗,但我现在找不到。这适合我的需要(简单的顶部菜单)。必须有一种更简单的方法来做到这一点,使用通配符,或者基于路线,进行最接近匹配的事情。我认为菜单是web应用程序的一个相当标准的部分,这将包括在内:)