如何根据两个URL区分路由

时间:2011-02-24 21:11:25

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

所以我有两个网址,我需要单独的路由:

/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-”恰好位于“翻转值”文本中。

所以我的问题是,如何为这些网址启用不同的操作方法?

编辑:为了澄清,这些网址是由我正在使用的其他一些约束预先定义的,无法更改。他们必须遵循这种格式。

2 个答案:

答案 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我在那里写过。