2011-02-24 88 views
0
如何区别不同的路由

所以,我有两个网址,我需要不同的途径为:基于两个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”,从“一些翻转的价值”的d只是将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)这两个网址最后两条路线相匹配菲尔哈克的RouteDebugger作为证明。

2)由于贪婪匹配(这就是为什么我在示例URL中使用文本“翻转值”),communityId最终包含“5555-some-other-flippin”,因为它与最后一次匹配URL中的“g-”,恰好在“翻转值”文本中。

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

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

+1

你可以实现你自己的路由处理程序,避免贪婪的匹配。我没有代码示例,因为我只是离开办公室,但如果没有人回复,我会尽量在今晚掏出一些东西。 – Basic 2011-02-24 21:14:24

回答

0

如果你可以生成社区的列表,那么你可以写一个自定义的正则表达式约束它将在运行时查找社区并为您找到它们。然后,它会构建约束条件,只捕捉符合社区要求的路线。一个潜在的问题是它只能在Application_Start上运行。动态改变它会很好。你可以可能通过在运行时更新RouteTable.Routes来做到这一点,但是这是很冒险的。

无论如何,我结束了回答another Stack Overflow question覆盖相同的地面,here's the answer我写在那里。

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+" } 
); 
+0

其实我有同样的想法,并尝试用你提出的完全相同的语法,但由于贪婪的匹配,它并不总是数字。在我的第二个URL中,communityId将包含“5555g-some-other-flippin”,这显然不是数字。:) – Scott 2011-02-24 21:45:03

+0

我不明白 - 约束应该强制路线与communityId是数字相匹配,它不会匹配其他方式? – 2011-02-24 21:47:47

+0

只要看看路由,你会认为communityId只包含“5555”,因此应该与约束匹配。然而,路由匹配是贪婪的,因为URL中有另一个“g-”(“some-other-flipping-value” - 翻转中的最后一个“g”),communityId实际上包含“555g-some-other-flippin” – Scott 2011-02-24 21:57:23