【问题标题】:MvcSitemapProvider - Add value to ignore in url resolverMvcSitemapProvider - 在 url 解析器中添加要忽略的值
【发布时间】:2014-02-04 18:57:48
【问题描述】:

我的 url-list 中有一个链接,其中包含动态 ID,即

/控制器/动作/id

例如,目前不需要为我的每个页面都有自己的面包屑,最好是跳回索引操作面包屑或简单地设置一个父解析网址。

是否有简单的解决方案或任何提示如何解决此问题?

提前谢谢你

【问题讨论】:

    标签: asp.net-mvc mvcsitemapprovider


    【解决方案1】:

    有两种方法可以将“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

    【讨论】:

    • 感谢您的快速答复 NightOwl888。我想使用第二种方式,因为第一种方式我有很多节点并且一直持有它们,需要大量的内存。目前我正在使用带有 Unity 的外部 DI 容器。当我将preservedRouteParameters 设置为“id”时,第一个“详细信息”页面正在使用面包屑,即/details/452。当我转到另一个页面时,即 /details/453 然后我没有任何面包屑了。我认为这是缓存的问题。就我在您的页面上阅读的内容而言,“如何制作...”应该会自动关闭缓存。
    • 如果使用preservedRouteParameters="parameterName",你不必乱用缓存,因为在这种情况下它会自动被禁用。如果您想通过使用 action 方法中的静态 SiteMaps 对象来设置 RouteValues 来手动模仿 reservedRouteParameters 所做的事情,则只需禁用已解析的 URL 缓存。
    • 我用你的例子试过了,它在那里工作得很好。但在我的项目中它不起作用。此外,当我使用 cacheResolvedUrl="0" 禁用缓存时,它也不起作用。只有当我释放整个缓存时,它才会加载我的数据。我也尝试过使用内部 DI,但这是同样的问题。你知道我可以尝试什么吗?
    • 谢谢NightOwl888,最终解决方案是将文化也添加到preservedRouteParameters。现在一切正常。
    猜你喜欢
    • 2015-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多