【发布时间】:2014-02-04 18:57:48
【问题描述】:
我的 url-list 中有一个链接,其中包含动态 ID,即
/控制器/动作/id
例如,目前不需要为我的每个页面都有自己的面包屑,最好是跳回索引操作面包屑或简单地设置一个父解析网址。
是否有简单的解决方案或任何提示如何解决此问题?
提前谢谢你
【问题讨论】:
标签: asp.net-mvc mvcsitemapprovider
我的 url-list 中有一个链接,其中包含动态 ID,即
/控制器/动作/id
例如,目前不需要为我的每个页面都有自己的面包屑,最好是跳回索引操作面包屑或简单地设置一个父解析网址。
是否有简单的解决方案或任何提示如何解决此问题?
提前谢谢你
【问题讨论】:
标签: asp.net-mvc mvcsitemapprovider
有两种方法可以将“id”或任何其他路由值与 MvcSiteMapProvider 一起使用。
1. 为每个“id”创建一个节点(通常通过DynamicNodeProviderBase 实现来完成)。这为您提供了“id”值和节点之间的一对一关系。如果您有
<mvcSiteMapNode title="Product 1" controller="Product" action="Details" id="1"/>
<mvcSiteMapNode title="Product 2" controller="Product" action="Details" id="2"/>
<mvcSiteMapNode title="Product 3" controller="Product" action="Details" id="3"/>
2. 通过在节点上设置preservedRouteParameters="id" 创建一个节点以匹配所有“id”值。这将为您提供路由参数名称“id”(值无关紧要)和节点之间的一对一关系。这仅适用于面包屑路径;对于 Menu、SiteMap 和 /sitemap.xml 端点,您将需要使用 visibility provider 以及 SiteMapTitle 属性来修复 UI 的显示。将此方法用于编辑数据且永远不会被搜索引擎看到的管理页面。
<mvcSiteMapNode title="Product 1" controller="Product" action="Details" preservedRouteParameters="id"/>
请注意,如果您有多个参数,您也可以在同一个节点上组合这两种技术。例如,如果您有一个搜索引擎永远不需要知道的用户特定的“userId”参数,您可以减少节点的数量(通常您需要为 [所有“id”值] X [所有“userId”值] - 也就是说,总节点数将等于 SiteMap 中所有潜在值组合的乘积),始终匹配“userId”,但仍为所有产品编制索引。
<mvcSiteMapNode title="Product 1" controller="Product" action="Details" id="1" preservedRouteParameters="userId"/>
<mvcSiteMapNode title="Product 2" controller="Product" action="Details" id="2" preservedRouteParameters="userId"/>
<mvcSiteMapNode title="Product 3" controller="Product" action="Details" id="3" preservedRouteParameters="userId"/>
另请注意,您不必使用 XML 来使用这些技术 - 在以其他方式声明节点时它们也可以工作。
我的博客上有一篇完整的文章描述了这些技术以及可下载的工作示例:How to Make MvcSiteMapProvider Remember a User's Position。
【讨论】: