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

时间:2015-07-16 11:16:09

标签: c# asp.net-mvc routing

我有一个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");

我该如何做到这一点?

1 个答案:

答案 0 :(得分:3)

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

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

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

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

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

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