C# 如何基于两个URL区分路由
因此,我有两个URL需要单独的路由:C# 如何基于两个URL区分路由,c#,asp.net-mvc,routing,asp.net-mvc-3,C#,Asp.net Mvc,Routing,Asp.net Mvc 3,因此,我有两个URL需要单独的路由: /find-your-new-home/155-detroit/1234-some-value 及 我要处理的路线是#1: 我在“Detail”方法上有一个动作过滤器,它将“155”从“detroit”中分离出来,也将“1234”从“某个翻转值”中分离出来,只将ID传递给动作方法(ID是最重要的,文本值无关紧要) 现在,第二条路线几乎完全相同,只是在“5555”值之后有一个“g”。此“g”表示它应该调用社区控制器上的另一个操作方法(“CommunityGr
/find-your-new-home/155-detroit/1234-some-value
及
我要处理的路线是#1:
我在“Detail”方法上有一个动作过滤器,它将“155”从“detroit”中分离出来,也将“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的RoutedBugger所证明的那样,两个URL最终都匹配两条路由
2) 由于贪婪匹配(这就是我在示例URL中使用文本“flipping value”的原因),communityId最终包含“5555其他flippin”,因为它与URL中最后出现的“g-”匹配,而“g-”恰好位于“flipping value”文本中
所以我的问题是,如何让这些URL使用不同的操作方法
编辑:只是澄清一下,这些URL是由我正在处理的其他一些约束预定义的,不能更改。它们必须完全遵循此格式。您可以尝试使路由的“communityId”部分仅匹配数字字符,例如:
routes.MapRoute(
"FindYourNewHomeCommunityGroup",
"find-your-new-home/{market}/{communityId}g-{community}.html",
new { controller = "Community", action = "CommunityGroup" },
new { communityId = @"\d+" }
);
如果可以生成社区列表,则可以编写自定义正则表达式约束,该约束将在运行时查找社区并为您找到它们。然后,它将构造约束,以仅捕获与您正在寻找的社区匹配的路由。它的一个潜在问题是,它只在
应用程序启动时起作用。动态地改变它会很好。当发生更改时,您可能可以通过在运行时更新RouteTable.Routes
来实现这一点,但这是很有技巧的
无论如何,我最后回答了同样的问题,我在那里写道。您可以实现自己的路由处理程序,避免贪婪的匹配。我手头没有代码示例,因为我正要离开办公室,但如果没有其他人回复,我将在今晚尝试挖掘一些东西。事实上,我也有同样的想法,并使用您建议的完全相同的语法进行了尝试,但由于贪婪匹配,它并不总是数字。在我的第二个URL中,communityId将包含“5555g其他flippin”,这显然不是数字。:)我不明白-约束应该强制路由与communityId匹配,因为它是数字的,而不是相反的方式匹配?只要查看路由,您就会认为communityId只包含“5555”,因此应该与约束匹配。然而,路由匹配是贪婪的,因为URL中有另一个“g-”(“其他翻转值”-翻转中的最后一个“g”),communityId实际上包含“555g其他翻转”。该约束应该停止communityId包含“555g其他翻转值”?该约束是正确的,还是仅匹配以数字字符开头的字符串?
routes.MapRoute(
"FindYourNewHomeCommunityGroup",
"find-your-new-home/{market}/{communityId}g-{community}.html",
new { controller = "Community", action = "CommunityGroup" }
);
routes.MapRoute(
"FindYourNewHomeCommunityGroup",
"find-your-new-home/{market}/{communityId}g-{community}.html",
new { controller = "Community", action = "CommunityGroup" },
new { communityId = @"\d+" }
);