【问题标题】:Can't seem to get MvcSiteMapProvider to work with routes that have route values似乎无法让 MvcSiteMapProvider 使用具有路由值的路由
【发布时间】:2014-03-12 19:20:21
【问题描述】:

我目前正在使用 MvcSiteMapProvider 为我动态生成面包屑

@Html.MvcSiteMap().SiteMapPath()

我的网站都是brand的,Url中的第一个值是brand,所以我的路由都是这样的:

routes.MapRoute("Terms", "{brand}/Terms", new { controller = "Legal", Action = "Terms" });
routes.MapRoute("Privacy", "{brand}/Privacy", new { controller = "Legal", Action = "Privacy" });
routes.MapRoute("Home", "{brand}", new { controller = "Home", action = "Dashboard" });
routes.MapRoute("Dashboard", "{brand}/Dashboard", new { controller = "Home", 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 始终为空。

有什么想法吗?

【问题讨论】:

    标签: asp.net-mvc routes url-routing asp.net-mvc-routing mvcsitemapprovider


    【解决方案1】:

    url 属性/属性用于配置具有绝对路径的 URL,而不是用于配置路由。当您使用 url 属性时,它基本上会禁用节点上的路由支持并将其变成基于 URL 的节点。这与与 ASP.NET 的互操作性或在您的站点地图中提供外部链接非常方便。您的 Url 不匹配,因为它们不是真实的 URL,这是预期的。

    要在节点上使用 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,了解如何做到这一点。

    更新

    我再次查看了您的配置,我想我已经发现了问题。您没有将节点配置为考虑品牌参数,因此它们永远不会匹配。如果(我怀疑)你试图让所有品牌都匹配这组节点,你需要添加“品牌”作为preservedRouteParameter强制它匹配。

    <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", "{brand}/Terms", new { controller = "Legal", Action = "Terms" });
    routes.MapRoute("Privacy", "{brand}/Privacy", new { controller = "Legal", Action = "Privacy" });
    
    // Action should always be lowercase (action)
    routes.MapRoute("Terms", "{brand}/Terms", new { controller = "Legal", action = "Terms" });
    routes.MapRoute("Privacy", "{brand}/Privacy", new { controller = "Legal", action = "Privacy" });
    

    【讨论】:

    • 谢谢。节点上的“Url”属性是我尝试 10 种不同的方式来配置它时留下的。最初,在更新之前,我使用了 Controller、Action,并根据需要使用了 Route。更新后完全没用。我现在正在使用 DynamicNodeProvider,但我正在努力使用正确的层次结构。
    • 请构建一个小型演示项目并将其发布到 GitHub 或将其压缩以供下载,然后open a new issue。有一些不同的事情发生了变化,这可能是问题的根源,我想尝试确定发生了什么。
    • 最后一点明白了。完全从我身边溜走。我之前尝试过使用“preservedRouteParameters”属性和覆盖“DynamicNodeProviderBase”的不同变体。但是我使用的两个测试用例都将它们的动作默认设置为“动作”而不是“动作”。
    猜你喜欢
    • 1970-01-01
    • 2014-11-04
    • 1970-01-01
    • 2021-01-04
    • 1970-01-01
    • 2011-12-23
    • 2021-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多