我使用的是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个URL是:
报告路线:
Report/10
报告_路段路线:
Report/10/Section/100
我在第二条路线上没有得到认可,因此面包屑轨迹不会出现在相关页面上。我曾希望通过在mvc.sitemap中指定"route"属性,mvcSiteMapProvider就能将两者绑定起来。
思想。我哪里错了?
非常感谢
编辑:
似乎我需要指定"控制器"one_answers"动作"中的"mvc.sitemap"one_answers"路由"本身是行不通的。
<mvcSiteMapNode title="Sections" controller="Section" action="FilterByReport" route="Report_Section" preservedRouteParameters="ClientId,ReportId">
route参数用于将匹配范围缩小到特定路由,而不是尝试匹配所有路由。但是,仅仅指定路由是不足以使其匹配的。您还需要提供操作、控制器、(可选)区域和(可选)操作参数。
此外,为了让它看起来记得你的面包屑轨迹,你需要为每个可能的ClientID/ReportID组合添加一个节点到你的网站地图中。通过使用几个DynamicNodeProviders从数据库/数据源加载数据,可以很容易地实现这一点。整个原理是基于在地图中匹配一个唯一的位置,您需要这些ID来使每个匹配都是唯一的。
PreservedRouteParameters通常用于使任何ID与CRUD操作中的操作方法参数相匹配。这使您能够使添加/编辑/删除页面与任何ID匹配,而无需在网站地图中注册这些ID。