我正在使用MVC3,C#,Razor,mvcSiteMapProvider V4。
我正在使用“Mvc.sitemap”
<mvcSiteMapNode title="Reports" controller="Report" action="Index" preservedRouteParameters="ClientId" route="Report">
<mvcSiteMapNode key="Report_Section" title="Sections" controller="Section" action="FilterByReport" preservedRouteParameters="ClientId,ReportId" route="Report_Section">
<mvcSiteMapNode key="Background" title="Background" controller="Wizard" action="Index" preservedRouteParameters="ClientId,ReportID,SectionID,SectionName" route="Background"/>
“Global.asax”自定义路线如下所示:
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 });
routes.MapRoute("Background", "Report/{ReportID}/SectionID/{SectionID}/SectionName/{SectionName}", new { controller = "Wizard", action = "Index", ReportID = UrlParameter.Optional, SectionID = UrlParameter.Optional, SectionName = UrlParameter.Optional });
“报告”和“Report_Section”路由正常工作。但是,当我进入“背景”路径时,我在mvcSiteMap BreadCrumb URL中丢失了所有路径结构,即“Report_Section”和“Report”路由。相反,我得到一个GUID即:
http://localhost/7ebe9bb9-a663-43fd-9fb1-865866be12b9
我相信这可能是自动生成的XML Node Key。然而,当点击时它会产生404。
我应该得到类似的东西:
报告
http://localhost/Report/10
节
http://localhost/Report/10/Section/100
任何可能导致此问题的想法?
感谢。
答案 0 :(得分:1)
如果网址解析器找不到匹配项,您将获得该网址的Guid。在这种情况下抛出异常会导致其他问题(请参阅why does URL resolver throw an exception)。
但是,如果没有看到更多配置,我无法确切地告诉您为什么它不匹配。一个线索是我们使用UrlHelper.RouteUrl(string,RouteValueDictionary)来解析URL。您可以尝试使用路由值和路由名称明确调用它。另外,请参阅source code了解其他线索。
我注意到的一件事是,当它甚至没有在该路由中使用时,你保留了Background的ClientID路由参数。请记住,保留路由参数只会从当前的HTTP请求中复制它们,而其他节点似乎会忘记它们。
PreserveRouteParameters通常用于进行数据编辑页面的CRUD操作。如果您希望它“记住”用户的导航路径,则需要为站点地图添加每个唯一路线值组合1个节点。
如果上述方法没有帮助,请创建一个展示问题的小型演示项目,然后将其上传到GitHub,或者将其压缩并使其可供下载,然后在GitHub打开一个新问题。演示链接。