无法将mvc.SiteMap中的XML节点绑定到global.asa中的路由?

时间:2013-08-17 00:43:35

标签: asp.net-mvc mvcsitemapprovider asp.net-mvc-sitemap

我正在使用MVC3,C#4,Razor,MvcSiteMapProvider V4。

我正在尝试将我的mvc.sitemap文件中的MvcSiteMapNodes显式绑定到我的global.asa中的路由。但它似乎没有用。毫无疑问,我省略了一些东西。

我在global.asa中的路线:

  routes.MapRoute("Report", "Report/{ClientId}", new { controller = "Report", action = "Index", ClientId = UrlParameter.Optional });
  routes.MapRoute("Report_Section", "Report/{ClientId}/Section/{ReportId}", new { controller = "Section", action = "FilterByReport", ReportId = UrlParameter.Optional });

我的mvc.sitemap的一部分:

        <mvcSiteMapNode title="Reports" controller="Report" action="Index" preservedRouteParameters="ClientId" route="Report">
     <mvcSiteMapNode title="Sections" route="Report_Section">

所以我的2个网址是:

报告路线:

Report/10

Reports_Sections路线:

Report/10/Section/100

我没有在第二条路线上获得认可,因此面包屑路径没有出现在相关页面上。我曾希望通过在mvc.sitemap中指定“route”属性,mvcSiteMapProvider将绑定两者。

思考。我哪里出错?

非常感谢

编辑:

似乎我需要在“mvc.sitemap”中指定“controller”和“action”,并且“route”本身不起作用。

         <mvcSiteMapNode title="Sections" controller="Section" action="FilterByReport"  route="Report_Section" preservedRouteParameters="ClientId,ReportId">

1 个答案:

答案 0 :(得分:1)

route参数用于将匹配范围缩小到特定路由,而不是尝试匹配所有路由。但是,仅指定路线不足以使其匹配。您还需要提供动作,控制器,(可选)区域和(可选)动作参数。

此外,为了使其能够记住您的痕迹痕迹,您需要为每个可能的ClientID / ReportID组合添加一个节点到您的站点地图。通过使用几个DynamicNodeProviders从数据库/数据源加载数据,可以相当容易地实现这一点。整个原则基于匹配地图中的唯一位置,您需要这些ID才能使每个匹配都是唯一的。

PreservedRouteParameters通常用于使任何ID与CRUD操作中的操作方法参数匹配。这使您能够使添加/编辑/删除页面与任何ID匹配,而无需在站点地图中注册这些ID。