我正在研究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的动作(在这个应用程序中一直发生),则会选择错误的路径。
要将这些约束硬编码到每个可能的控制器/动作组合中,对我来说似乎有很多重复,我感觉我一直在看问题太长时间,所以我需要另外一双眼睛来帮忙。
我可以使用通用路由来处理这种情况吗?或者我是否需要为每个控制器设置自定义路由,并对这些路由上的操作应用约束?
由于
答案 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 }
);