【问题标题】:Generic ASP.NET MVC Route Conflict通用 ASP.NET MVC 路由冲突
【发布时间】:2010-12-29 13:48:11
【问题描述】:

我正在开发旧版 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 控制器有一个采用 pdn 的操作和另一个采用 clientId 的操作(在此应用中一直发生),则选择了错误的路由。

将这些约束硬编码到每个可能的控制器/动作组合中对我来说似乎有很多重复,我觉得我已经研究这个问题太久了,所以我需要另一双眼睛来帮忙。

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

谢谢

【问题讨论】:

  • 看起来我必须完全重新配置客户端路由才能尝试使其正常工作。感谢大家的提示。

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


【解决方案1】:

通过删除 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

【讨论】:

  • 如下所述...两者都可以是字符串或 ID。我认为那是他们的问题所在。 :\
  • @Donn 是的,这将是一个错误。那么你将不得不让它们有不同的路线。
【解决方案2】:

您应该添加一些路由约束,说明 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 }
);

【讨论】:

  • 我应该指出,两者都可以是字符串或 ID。我认为那是他们的问题所在。 :\
  • 我建议将它们分成不同的控制器。
猜你喜欢
  • 2016-04-17
  • 2012-03-19
  • 2011-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多