MvcSiteMapProvider在mvc中给出节点计数零

时间:2014-07-28 09:56:57

标签: c# xml asp.net-mvc asp.net-mvc-4 mvcsitemapprovider

我正在使用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> &gt; </text>
    }
}

当生成的网址也正确时,节点数为零的原因是什么?

1 个答案:

答案 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