映射多个索引路由

时间:2012-09-25 20:30:00

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

我在应用程序中有许多控制器:

ApiV1Controller
ApiV2Controller
ApiV3Controller
...

是否可以将单个MapRoute语句的路线映射到/api/v1/{action}等网址?

1 个答案:

答案 0 :(得分:1)

您可以编写自定义路线。我们假设你有以下控制器:

public class ApiV1Controller : Controller
{
    public ActionResult Index()
    {
        return Content("v1");
    }
}

public class ApiV2Controller : Controller
{
    public ActionResult Index()
    {
        return Content("v2");
    }
}

public class ApiV3Controller : Controller
{
    public ActionResult Index()
    {
        return Content("v3");
    }
}

现在写一条自定义路线:

public class ApiRoute : Route
{
    public ApiRoute()
        : base("api/{version}/{action}", new RouteValueDictionary(new { action = "index" }), new MvcRouteHandler())
    {
    }

    public override RouteData GetRouteData(HttpContextBase httpContext)
    {
        var rd = base.GetRouteData(httpContext);
        if (rd == null)
        {
            return null;
        }

        rd.Values["controller"] = "Api" + rd.GetRequiredString("version");
        return rd;
    }
}

可以在Global.asax

中注册
public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.Add("ApiRoute", new ApiRoute());

    routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}/{id}", // URL with parameters
        new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
    );
}

这就是它。现在你可以玩网址了:

  • /api/v1
  • /api/v2
  • /api/v3