asp.net-mvc – 似乎无法使MvcSiteMapProvider与具有路由值的路
我目前正在使用MvcSiteMapProvider动态生成我的面包屑
@Html.MvcSiteMap().SiteMapPath() 我的网站都是品牌,而网址中的第一个值包含该品牌,所以我的路线都是这样的: routes.MapRoute("Terms","{brand}/Terms",new { controller = "Legal",Action = "Terms" }); routes.MapRoute("Privacy","{brand}/Privacy",Action = "Privacy" }); routes.MapRoute("Home","{brand}",new { controller = "Home",action = "Dashboard" }); routes.MapRoute("Dashboard","{brand}/Dashboard",action = "Dashboard" }); 这在以前的版本中有所作为,但我看到了使用两个不同品牌查看相同路线的间歇性问题.一旦我更新,我现在什么都没有. 我的站点地图如下所示: <mvcSiteMapNode title="Home" url="/{brand}" route="Home"> <mvcSiteMapNode title="Dashboard" url="/{brand}/Dashboard" route="Dashboard" /> <mvcSiteMapNode title="Terms" url="/{brand}/Terms" route="Terms" /> <mvcSiteMapNode title="Privacy" url="/{brand}/Privacy" route="Privacy" /> </mvcSiteMapNode> 我已经通过文档挖掘更新,并尝试了大量不同的东西.我已将源代码包含在我的项目中并进行了调试,我唯一看到的是无论我做什么,currentNode始终为null. 有任何想法吗? 解决方法
url属性/属性用于配置具有绝对路径的URL,而不是用于配置路由.当您使用url属性时,它基本上禁用节点上的路由支持并将其转换为基于URL的节点.这与ASP.NET的互操作性或在SiteMap中提供外部链接非常方便.您的网址不匹配,因为它们不是真正的网址,这是预期的.
要在节点上使用MVC路由,您基本上必须按照配置ActionLink或RouteLink的方式配置它们(与可选路由属性一起使用时). <mvcSiteMapNode title="Home" controller="Home" action="Dashboard" route="Home"> <mvcSiteMapNode title="Dashboard" action="Dashboard" route="Dashboard" /> <mvcSiteMapNode title="Terms" controller="Legal" action="Terms" route="Terms" /> <mvcSiteMapNode title="Privacy" controller="Legal" action="Privacy" route="Privacy" /> </mvcSiteMapNode> 另请注意,使用XML进行配置时,区域和控制器属性会自动从最后定义它们的祖先节点继承,这可以为您节省一些繁重的工作.而且,这些路线完全是可选的. <mvcSiteMapNode title="Home" controller="Home" action="Dashboard"> <mvcSiteMapNode title="Dashboard" action="Dashboard" /> <mvcSiteMapNode title="Terms" controller="Legal" action="Terms" /> <mvcSiteMapNode title="Privacy" controller="Legal" action="Privacy" /> </mvcSiteMapNode> 但是使用自定义路由参数是一个棘手的问题.看看this answer,了解如何做到这一点. 更新 我再看看你的配置,我想我已经发现了这个问题.您没有将节点配置为考虑品牌参数,因此它们永远不会匹配.如果(我怀疑)你试图使所有品牌都匹配这一组节点,你需要添加“品牌”作为保留的路径参数强制它匹配. <mvcSiteMapNode title="Home" controller="Home" action="Dashboard" preservedRouteParameters="brand"> <mvcSiteMapNode title="Dashboard" action="Dashboard" preservedRouteParameters="brand"/> <mvcSiteMapNode title="Terms" controller="Legal" action="Terms" preservedRouteParameters="brand"/> <mvcSiteMapNode title="Privacy" controller="Legal" action="Privacy" preservedRouteParameters="brand"/> </mvcSiteMapNode> 这会导致当前请求的品牌在比较之前被复制到节点的RouteValues中.要获得匹配,您需要在节点的RouteValues中具有与当前请求的RouteValues中相同的键和值(值不区分大小写).如果不这样,currentNode将始终为null. 它之前似乎有用的原因是因为v4.4.x也匹配了URL,这是导致无效匹配发生的错误. 有一篇完整的文章详细介绍了匹配如何工作标题为How to Make MvcSiteMapProvider Remember a User’s Position. 更新2 我还注意到您的路线上没有设置您的默认值. “Action”应该是“action”,因为路由键区分大小写. // This is what you have routes.MapRoute("Terms",Action = "Privacy" }); // Action should always be lowercase (action) routes.MapRoute("Terms",action = "Terms" }); routes.MapRoute("Privacy",action = "Privacy" }); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-core-mvc – ASP.NET MVC6 Beta8和Windows身份验证
- 测量ASP.NET页面加载时间
- asp.net-mvc – 隐藏列并在编辑时显示字段或在jqGrid中添加
- asp.net-core – 在执行DI时指定服务选项的干净方法
- asp-classic – 哪里可以存储经典ASP的连接字符串?
- asp.net – 英国邮政编码查找流程的好例子
- 如何在asp.net中使用facebook api创建一个facebook事件
- asp.net-mvc – 无法在asp mvc项目中从iis上的Content文件夹
- asp.net-mvc – ASP.NET MVC主页数据
- kendo-ui – Kendo UI MVC将MultiSelect数据值发送到Action
- asp.net-mvc – 在BaseController的OnActionExec
- asp.net-mvc – ASP .NET MVC正确的UserControl架
- asp.net-mvc-3 – Rackspace Cloud Sites和ASP.N
- asp.net-mvc-4 – 如何获取没有隐藏输入的AntiFo
- asp.net-mvc – 在运行时替换控制器操作
- asp.net – 让wmd-editor不发布html?
- asp.net-mvc – 统一MVC和Web Api – 视图和json
- asp.net – .NET 4.0实现OutputCacheProvider
- asp.net – 为什么Jet OLEDB驱动程序缓存我的MDB
- iis-7 – 主域和可信域之间的信任关系失败