2012-09-25 42 views
1

我有很多应用的控制器:地图索引多途径

ApiV1Controller 
ApiV2Controller 
ApiV3Controller 
... 

是否有可能映射单MapRoute语句像/api/v1/{action}网址为他们的路线?

回答

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 
    ); 
} 

,这就是这么多了。现在,你可以使用URL玩:

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