【问题标题】:How to differentiate routes based on two URLs如何根据两个 URL 区分路由
【发布时间】:2011-02-24 21:11:24
【问题描述】:

所以我有两个需要单独路由的 URL:

/find-your-new-home/155-detroit/1234-some-value

 /find-your-new-home/155-detroit/5555g-some-other-flipping-value

我处理 #1 的路线是:

routes.MapRoute(
                "FindYourNewHomeCommunity",
                "find-your-new-home/{market}/{community}.html",
                new { controller = "Community", action = "Detail" }
                );

我在“详细信息”方法上有一个操作过滤器,它将“155”从“底特律”中拆分出来,并将“1234”从“一些翻转值”中拆分出来,并且只将 ID 传递给操作方法(ID 是无论如何,文本值是无关紧要的)。

现在,第二条路线几乎完全相同,只是在“5555”值后面有一个“g”。这个“g”表示它应该调用社区控制器上的另一个操作方法(“CommunityGroup”)。

我的问题是:如何配置两条路由来分别处理这些?我试过了:

routes.MapRoute(
                    "FindYourNewHomeCommunityGroup",
                    "find-your-new-home/{market}/{communityId}g-{community}.html",
                    new { controller = "Community", action = "CommunityGroup" }
                    );

但是这不起作用,原因有两个:

1) 正如 Phil Haack 的 RouteDebugger 所证明的那样,两个 URL 最终都匹配了两个路由。

2) 由于贪心匹配(这就是我在示例 URL 中使用文本“flipping-value”的原因),communityId 最终包含“5555-some-other-flippin”,因为它匹配最后一次出现的URL中的“g-”,恰好在“flipping-value”文本中。

所以我的问题是,如何为这些 URL 触发不同的操作方法?

编辑: 澄清一下,这些 URL 是由我正在处理的其他一些约束预先定义的,无法更改。他们必须完全遵循这种格式。

【问题讨论】:

  • 您可以实现自己的路由处理程序并避免贪婪匹配。我刚离开办公室,手头没有代码示例,但如果没有其他人回复,我今晚会尝试挖掘一些东西。

标签: c# asp.net-mvc routing asp.net-mvc-3


【解决方案1】:

您可以尝试creating a route constraint,这样路由的“communityId”部分将只匹配数字字符,例如:

routes.MapRoute(
    "FindYourNewHomeCommunityGroup",
    "find-your-new-home/{market}/{communityId}g-{community}.html",
    new { controller = "Community", action = "CommunityGroup" },
    new { communityId = @"\d+" }
);

【讨论】:

  • 其实我也有同样的想法,并用你建议的完全相同的语法尝试了它,但由于贪婪匹配,它并不总是数字。对于我的第二个 URL,communityId 将包含“5555g-some-other-flippin”,这显然不是数字。 :)
  • 我不明白 - 约束应该强制路由匹配 communityId 为数字,否则不匹配?
  • 只看路线,您会认为 communityId 将仅包含“5555”,因此应该匹配约束。然而,路由匹配是贪婪的,因为在 URL 中有另一个“g-”(“some-other-flipping-value” - 最后一个“g”在翻转”,communityId 实际上包含“555g-some-other-flippin” .
  • 约束应该阻止 communityId 曾经包含“555g-some-other-flippin”?
  • 这个约束是对的,还是只是匹配以数字字符开头的字符串?
【解决方案2】:

如果您可以生成社区列表,那么您可以编写一个自定义正则表达式约束,它将在运行时查找社区并为您找到它们。然后它将构建约束以仅捕获与您正在寻找的社区匹配的路线。它的一个潜在问题是它仅适用于Application_Start。动态更改它会很好。您可以可能在有更改时在运行时更新RouteTable.Routes 来做到这一点,但那是hacky。

不管怎样,我最终回答了 another Stack Overflow question 覆盖相同的领域,here's the answer 我在那里写的。

【讨论】:

    猜你喜欢
    • 2022-10-15
    • 2021-01-17
    • 1970-01-01
    • 2013-08-10
    • 1970-01-01
    • 1970-01-01
    • 2017-07-30
    • 1970-01-01
    • 2019-12-18
    相关资源
    最近更新 更多