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

Ric*_*ban 2 c# asp.net-mvc routes

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

这意味着对新应用程序的每个请求都以 开始,/checkout这让我们遇到了稍微不满意的情况,即站点中的每个控制器都用 装饰[RoutePrefix("checkout")]

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

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

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

我怎样才能做到这一点?

Ric*_*ban 5

我找到了一种方法,不确定这是否是最佳实践,但似乎效果很好。我注意到该MapMvcAttributeRoutes方法可以采用IDirectRouteProvider作为参数。

这需要一些猜测,但我能够编写一个从框架派生DefaultDirectRouteProvider并重写 GetRoutePrefix 方法的类:

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

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

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

        routes.MapMvcAttributeRoutes(new CheckoutPrefixRouteProvider());
    }
}
Run Code Online (Sandbox Code Playgroud)