我正在使用MvcSiteMapProvider首次在MVC项目中实现SiteMap。我的xml是(Mvc.sitemap):
<mvcSiteMapNode title="Home" controller="Home" action="Index">
<mvcSiteMapNode title="Blog" controller="Blog" action="Index">
<mvcSiteMapNode title="Entry" controller="Blog" action="Entry"/><!--Not working-->
</mvcSiteMapNode>
</mvcSiteMapNode>
我更确定xml很好。
SiteMap for(Home,Index)和(Blog,Index)工作。但不是(Blog,Entry); SiteMapHelperModel.cshtml的模型计数为0:
@foreach (var node in Model)
{
@Html.DisplayFor(m => node);
if (node != Model.Last()) {
<text> > </text>
}
}
当生成的网址也正确时,节点数为零的原因是什么?
答案 0 :(得分:0)
我冒昧地猜测你的博客条目有某种标识符(&#34; id&#34;)导致节点不匹配。必须始终手动处理自定义参数。有两种方法可以做到。
选项1
默认情况下,您需要为每个自定义参数组合创建1个节点,例如:
<mvcSiteMapNode title="Home" controller="Home" action="Index">
<mvcSiteMapNode title="Blog" controller="Blog" action="Index">
<mvcSiteMapNode title="Blog Entry 1" controller="Blog" action="Entry" id="1"/>
<mvcSiteMapNode title="Blog Entry 2" controller="Blog" action="Entry" id="2"/>
<mvcSiteMapNode title="Blog Entry 3" controller="Blog" action="Entry" id="3"/>
</mvcSiteMapNode>
</mvcSiteMapNode>
如果您的数据基于外部数据源,最好使用dynamic node provider或实施ISiteMapNodeProvider。
如果您希望节点在菜单和/或/sitemap.xml端点中可见,这是推荐的方式,以便您的页面可以提交给搜索引擎。只是尝试将节点总数保持在10,000以下。
选项2
您可以强制单个节点匹配&#34; id&#34;的任何值。将其添加为savedRouteParameter。
<mvcSiteMapNode title="Home" controller="Home" action="Index">
<mvcSiteMapNode title="Blog" controller="Blog" action="Index">
<mvcSiteMapNode title="Entry" controller="Blog" action="Entry" preservedRouteParameters="id"/>
</mvcSiteMapNode>
</mvcSiteMapNode>
您通常需要使用SiteMapTitleAttribute修复标题。此外,使用此方法无法在Menu HTML帮助程序,SiteMap HTML帮助程序或/sitemap.xml端点中显示所有节点。你得到了一条面包屑痕迹,但这就是它。因此,最好使用FilteredSiteMapNodeVisibilityProvider将此节点与其他控件隐藏起来。
这种方法非常适合CRUD操作,忽略&#34; session&#34;参数,或者在SiteMap中有如此多节点导致性能下降的情况。
这两个选项可以组合在同一个节点上(但参数不同)。
有关可下载演示的深入了解这些选项,请参阅How to Make MvcSiteMapProvider Remember a User's Position。