所以我有两个网址,我需要单独的路由:
/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" }
);
我在“Detail”方法上有一个动作过滤器,它将“155”从“detroit”中分离出来,并将“1234”从“some-flipping-value”中分离出来,只将ID传递给action方法(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所证实的那样。
2)由于贪婪的匹配(这就是为什么我在示例URL中使用了文本“flipping-value”),因此communityId最终包含“5555-some-other-flippin”,因为它匹配最后一次出现的URL中的“g-”恰好位于“翻转值”文本中。
所以我的问题是,如何为这些网址启用不同的操作方法?
编辑:为了澄清,这些网址是由我正在使用的其他一些约束预先定义的,无法更改。他们必须遵循这种格式。
答案 0 :(得分: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+" }
);
答案 1 :(得分:0)
如果您可以生成社区列表,那么您可以编写一个自定义正则表达式约束,该约束将在运行时查找社区并为您找到它们。然后,它将构建约束以仅捕获与您要为社区查找的路径匹配的路径。它的一个潜在问题是它只适用于Application_Start
。动态更改它会很不错。您可以通过在运行时更新RouteTable.Routes
来执行此操作 ,但这很糟糕。
无论如何,我最终回答了another Stack Overflow question覆盖同一理由,here's the answer我在那里写过。