【发布时间】: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