通用ASP.NET MVC路由冲突

时间:2010-12-29 13:48:12

标签: asp.net-mvc routes asp.net-mvc-routing

我正在研究Legacy ASP.NET系统。我说遗产是因为大约90%的系统没有测试。我正在尝试修复此项目中的路由,并且我遇到了一个我想用通用路由解决的问题。

我有以下路线:

        routes.MapRoute(
             "DefaultWithPdn",
             "{controller}/{action}/{pdn}",
             new { controller = "", action = "Index", pdn = "" },
             null
         );

        routes.MapRoute(
           "DefaultWithClientId",
           "{controller}/{action}/{clientId}",
           new { controller = "", action = "index", clientid = "" },
           null
       );

问题是第一条路线正在捕获我需要路由到第二条路线的所有流量。路由是通用的(在任一路由定义中的约束中都没有定义控制器),因为整个应用程序中的多个控制器共享同一个前提(有时我们需要“pdn”,有时我们需要“clientId”)。

如何映射这些通用路线,以便它们进入正确的控制器和操作,但没有一个太贪心?或者我可以吗?这些路线是否过于通用(这是我开始相信的情况)。

此时我唯一的选择(AFAIK)是以下之一:

在约束中,应用正则表达式来匹配动作值,例如:(foo | bar | biz | bang)和控制器相同:( home | customer | products)每个控制器。但是,我有可能需要这样做:

〜/ Foo / Home / 123 //应映射到“DefaultwithPdn”

〜/ Foo / Home / abc //应映射到“DefaultWithClientId”

这意味着如果Foo Controller有一个采取pdn的动作和另一个采用clientId的动作(在这个应用程序中一直发生),则会选择错误的路径。

要将这些约束硬编码到每个可能的控制器/动作组合中,对我来说似乎有很多重复,我感觉我一直在看问题太长时间,所以我需要另外一双眼睛来帮忙。

我可以使用通用路由来处理这种情况吗?或者我是否需要为每个控制器设置自定义路由,并对这些路由上的操作应用约束?

由于

2 个答案:

答案 0 :(得分:3)

通过移除null并使用该路线所需的约束替换它来为您的路线添加约束:

对于PDN,请对数字使用正则表达式:

   routes.MapRoute(
         "DefaultWithPdn",
         "{controller}/{action}/{pdn}",
         new { controller = "", action = "Index", pdn = "" },
         new { pdn = @"\d+" } 
     );

对于ClientID,请对所有字符使用正则表达式:

    routes.MapRoute(
       "DefaultWithClientId",
       "{controller}/{action}/{clientid}",
       new { controller = "", action = "index", clientid = "" },
       new { clientid = @"[A-Za-z]+" }
   );

由于我没有把正则表达式的细节留在我脑海中,我generally use a cheat sheet

答案 1 :(得分:1)

您应该添加一些路由约束,表示PDN路由匹配数字,而ClientId匹配字符串

我通常会创建一系列匹配,以便在我的路线声明中使用,如下所示:

readonly static string ALPHA_MATCH = @"[\da-zA-Z]";
readonly static string DIGIT_MATCH = @"\d+";

然后将约束添加到路径中,如下所示:

routes.MapRoute(
    "DefaultWithPdn",
    "{controller}/{action}/{pdn}",
    new { controller = "", action = "Index", pdn = "" },
    new { pdn = DIGIT_MATCH }
);

routes.MapRoute(
    "DefaultWithClientId",
    "{controller}/{action}/{clientId}",
    new { controller = "", action = "index", clientid = "" },
    new { clientId = ALPHA_MATCH }
);