是否可以使用面包屑有两条不同的路径?

Is it possible to have two different paths using breadcrumbs?

我正在使用 MvcSiteMapProvider 在我的应用程序中生成面包屑。

@Html.MvcSiteMap().SiteMapPath()

在应用程序中,我们有一个 Batch 实体和一个 Item 实体。批次有项目。但是在应用程序中可以在不通过特定 Batch 的情况下访问 Items。

如果用户像这样经过 Batch,我想显示用户遵循的路径:

首页 -> 批次 -> [批号] -> [项目]

如果项目是直接访问的,我想显示这样的路径:

首页 -> 物品 -> [物品]

我的mvc.sitemap配置如下:

<mvcSiteMapNode title="$resources:Resources.Resources,Home" controller="Home" action="Index" preservedRouteParameters="culture">
    <mvcSiteMapNode title="$resources:Resources.Resources,Batch" controller="Batch" action="Index" preservedRouteParameters="culture">
      <mvcSiteMapNode title="$resources:Resources.Resources,NewBatch" controller="Batch" action="Create" preservedRouteParameters="culture" visibility="SiteMapPathHelper,!*" />
      <mvcSiteMapNode title="Edit" controller="Batch" action="Edit" preservedRouteParameters="culture,batchId" visibility="SiteMapPathHelper,!*">
        <mvcSiteMapNode title="Item" controller="Item" action="Edit" preservedRouteParameters="culture,itemId,batchId" visibility="SiteMapPathHelper,!*">
        </mvcSiteMapNode>
        <mvcSiteMapNode title="$resources:Resources.Resources,NewItem" controller="Item" action="Create" preservedRouteParameters="culture,noLot" visibility="SiteMapPathHelper,!*" />
      </mvcSiteMapNode>
    </mvcSiteMapNode>
    <mvcSiteMapNode title="$resources:Resources.Resources,Item" controller="Item" action="Index" preservedRouteParameters="culture">
      <mvcSiteMapNode title="Item" controller="Item" action="Edit" preservedRouteParameters="culture,itemId" visibility="SiteMapPathHelper,!*">
      </mvcSiteMapNode>
      <mvcSiteMapNode title="$resources:Resources.Resources,NewItem" controller="Item" action="Create" preservedRouteParameters="culture" visibility="SiteMapPathHelper,!*" />
    </mvcSiteMapNode>
  </mvcSiteMapNode>

可以吗?

使用当前配置,显示的路径始终为:

首页 -> 批次 -> [批号] -> [项目]

如果我颠倒 mvc.sitemap 文件中的顺序,它总是显示:

首页 -> 物品 -> [物品]

没有

第一个匹配总是获胜,并且使用相同路由值配置的多个节点不支持

SiteMap 根本不使用会话状态,因此没有 "previous URL" 用户访问过的概念。有关其工作原理的完整说明,请参阅 How To Make MvcSiteMapProvider Remember a User's Position

唯一的内置选项是 add additional information to the URL(路径或查询字符串)来区分 URL,因为第一个匹配总是获胜。当用户位于 "pass through" 页面时,您可能会生成不同的 URL。

但是,也可以使用依赖注入来替换 MvcSiteMapProvider 的匹配行为,这样它就可以匹配会话状态值。如果您这样做,那么 URL 就不需要不同,但您仍然需要在每个 "pass through" 页面上设置会话状态键和值。只要您在用户不通过任何页面时始终配置默认页面,它就可以正常工作。见 demo project and explanation how to use it.