C# mvc中给定节点计数为零的MvcSiteMapProvider

C# mvc中给定节点计数为零的MvcSiteMapProvider,c#,xml,asp.net-mvc,asp.net-mvc-4,mvcsitemapprovider,C#,Xml,Asp.net Mvc,Asp.net Mvc 4,Mvcsitemapprovider,我第一次使用MvcSiteMapProvider在MVC项目中实现站点地图。我的xml isMvc.SiteMap: <mvcSiteMapNode title="Home" controller="Home" action="Index"> <mvcSiteMapNode title="Blog" controller="Blog" action="Index"> <mvcSiteMapNode title="Entry" controll

我第一次使用MvcSiteMapProvider在MVC项目中实现站点地图。我的xml isMvc.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是好的

主页、索引和博客、索引工作的网站地图。但不是博客、条目; SiteMapHelperModel.cshtml的模型计数为0:

@foreach (var node in Model)
 { 
    @Html.DisplayFor(m => node);

    if (node != Model.Last()) {
        <text> &gt; </text>
    }
}

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

我冒昧地猜测,您的博客条目具有某种标识符id,导致节点不匹配。自定义参数必须始终手动处理。有两种方法可以做到这一点

选择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>
如果您的数据基于外部数据源,那么最好使用or实现ISItemaNodeProvider

如果希望节点在菜单和/或/sitemap.xml端点中可见,以便将页面提交给搜索引擎,建议使用这种方法。只需将节点总数保持在10000以下即可

选择2

通过将单个节点添加为参数,可以强制该节点匹配id的任何值

<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>
您通常需要使用来修复标题。此外,使用此方法不可能让所有节点都显示在菜单HTML helper、SiteMap HTML helper或/SiteMap.xml endpoint中。你有面包屑痕迹,但仅此而已。因此,最好使用对其他控件隐藏此节点

这种方法非常适合CRUD操作、忽略会话参数或站点地图中节点过多导致性能下降的情况

这两个选项可以组合在同一节点上,但参数不同


要通过可下载的演示深入了解这些选项,请参阅。

生成的url是动态的,就像博客的入口页面一样;我已经为此使用了路由。我希望所有的页面都具有相似的结构,即。{date yyyyy/mm/dd}/{blogName}被标识为Blog,条目页面也被标识为am实现breadcrumb。还有什么建议吗?这将是一个很好的帮助。首先,考虑如何让应用程序根据URL中的信息查找博客条目。接下来,配置路由以向应用程序提供信息。第三,让你的控制器动作起作用。完成此操作后,向MvcSiteMapProvider提供在路由中使用的路由参数。如果你发布你的路线信息,我可以帮你。如果实现自定义路由代码,则继承RouteBase而不是RouteHandler,因为RouteHandler无法执行双向路由。以下是一些值得思考的问题: