MVC 路由有冲突

MVC routes are in conflict

我的 ASP.NET MVC 应用程序中需要有 2 条路由,但我很难尝试以一种不会相互窃取的方式定义路由。

  1. 我需要处理像
  2. 这样的url

www.website.com/Home/About

www.website.com/Home/Contact

  1. 我也需要这样url

www.website.com/23a244x3/Products/2

www.website.com/434e5s344/Services/1

www.website.com/f2432g423/Profile

所以我需要2条路线。

#1 中的 url 被默认路由成功处理,即

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

为了处理#2 中的 urls,我定义了以下路由

routes.MapRoute(
    name: "PagesRoute",
    url: "{uniqueID}/{action}/{pagecount}",
    defaults: new { controller = "Pages", pagecount = UrlParameter.Optional }
);

不幸的是,现在路由 #2(又名 PagesRoute)也在处理来自 #1 的 url,例如 www.website.com/Home/About。我还在 IIS 中设置了 url 重写规则,将所有 url 变成小写,以用于 SEO 目的,因此 /Home 重定向到 /home 等

如何区分这两条路线? #2 中的路线似乎很贪心..

您将不得不不提供控制器,并为每个控制器提供路由:

routes.MapRoute(
    name: "Default",
    url: "Home/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

对于解析器来说,{uniqueID}{controller} 本质上是一样的。 Url 中的任何字符串都将匹配这两个路由,因此您需要一些东西来区分 2.

你也可以看看 Route Constraints:

routes.MapRoute(
    "PagesRoute",
    "{uniqueID}/{action}/{pagecount}",
    new { controller = "Pages", pagecount = UrlParameter.Optional },
    new { uniqueID = @"\d+" }
);