Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何基于两个URL区分路由_C#_Asp.net Mvc_Routing_Asp.net Mvc 3 - Fatal编程技术网

C# 如何基于两个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

因此,我有两个URL需要单独的路由:

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