是否可以为整个 MVC 应用程序设置全局 RoutePrefix?

Is it possible to set a global RoutePrefix for an entire MVC application?

我有一个 MVC 网站,我们正在使用它来托管我们的新结账流程。我们的 ARR 服务器中有一个重写规则,因此对 https://www.oursite.com/checkout 的任何请求都会转到这个新应用程序而不是旧站点。

这意味着对新应用程序的每个请求都以 /checkout 开头,这让我们有点不满意站点中的每个控制器都装饰有 [RoutePrefix("checkout")]

有没有一种方法可以设置自动应用于应用程序中所有控制器的全局路由前缀?我们没有自己的通用基础控制器来放置属性。我能想到的唯一选择是回到老式路由:

routes.MapRoute(
            "Default",
            "checkout/{controller}/{action}/{id}",
            new { controller = "Home", action = "Index", id = "" }
        );

我更喜欢使用属性路由,所以我想调用 routes.MapMvcAttributeRoutes(globalPrefix: "checkout");

我怎样才能做到这一点?

我找到了一种方法,不确定它是否是最佳实践,但它似乎工作得很好。我注意到 MapMvcAttributeRoutes 方法可以将 IDirectRouteProvider 作为参数。

我做了一些猜测,但我能够编写一个 class 派生自框架的 DefaultDirectRouteProvider 并覆盖 GetRoutePrefix 方法:

public class CheckoutPrefixRouteProvider : DefaultDirectRouteProvider
{
    protected override string GetRoutePrefix(ControllerDescriptor controllerDescriptor)
    {
        return "checkout/" + base.GetRoutePrefix(controllerDescriptor);
    }
}

然后我可以按如下方式使用这个新的 class:

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapMvcAttributeRoutes(new CheckoutPrefixRouteProvider());
    }
}