一、 自定义路由需要继承RouteBase类
RouteBase类有两个抽象方法:1.GetRouteData和GetVirtualPath
GetRouteData用于重构RouteData数据,GetVirtualPath用于重写产生的URL。
下面通过一个例子来说明如何自定义自己的路由:
1. 新建一个Controller

1 namespace URLsAndRoutes.Controllers { 2 public class LegacyController : Controller { 3 public ActionResult GetLegacyURL(string legacyURL) { 4 return View((object)legacyURL); 5 } 6 } 7 }
2.自定义路由类

1 public class LegacyRoute : RouteBase { 2 private string[] urls; 3 public LegacyRoute(params string[] targetUrls) { 4 urls = targetUrls; 5 } 6 public override RouteData GetRouteData(HttpContextBase httpContext) { 7 RouteData result = null; 8 string requestedURL = 9 httpContext.Request.AppRelativeCurrentExecutionFilePath; 10 if (urls.Contains(requestedURL, StringComparer.OrdinalIgnoreCase)) { 11 result = new RouteData(this, new MvcRouteHandler()); 12 result.Values.Add("controller", "Legacy"); 13 result.Values.Add("action", "GetLegacyURL"); 14 result.Values.Add("legacyURL", requestedURL); 15 } 16 return result; 17 } 18 public override VirtualPathData GetVirtualPath(RequestContext requestContext, 19 RouteValueDictionary values) { 20 return null; 21 } 22 }
3.在Global.acax.cs文件中注册自定义路由

1 public static void RegisterRoutes(RouteCollection routes) { 2 routes.Add(new LegacyRoute( 3 "~/articles/Windows_3.1_Overview.html", 4 "~/old/.NET_1.0_Class_Library")); 5 routes.MapRoute("MyRoute", "{controller}/{action}/{id}", 6 new { controller = "Home", action = "Index", id = UrlParameter.Optional }); 7 }
运行程序
二、自定义生成URL
重写VirtualPathData方法:

1 public override VirtualPathData GetVirtualPath(RequestContext requestContext, 2 RouteValueDictionary values) { 3 VirtualPathData result = null; 4 if (values.ContainsKey("legacyURL") && 5 urls.Contains((string)values["legacyURL"], StringComparer.OrdinalIgnoreCase)) { 6 result = new VirtualPathData(this, 7 new UrlHelper(requestContext) 8 .Content((string)values["legacyURL"]).Substring(1)); 9 } 10 return result; 11 }
在页面中添加连接:

1 @Html.ActionLink("Click me", "GetLegacyURL", new { legacyURL = 2 "~/articles/Windows_3.1_Overview.html" })
三、自定义路由处理类
Mvc默认使用 MvcRouteHandler来处理URL,同时,MVC框架允许我们自定义自己的RouteHandler类。我们只需要实现IRouteHandler类:

1 public class CustomRouteHandler : IRouteHandler { 2 public IHttpHandler GetHttpHandler(RequestContext requestContext) { 3 return new CustomHttpHandler(); 4 } 5 } 6 public class CustomHttpHandler : IHttpHandler { 7 public bool IsReusable { 8 get { return false; } 9 } 10 public void ProcessRequest(HttpContext context) { 11 context.Response.Write("Hello"); 12 } 13 }
然后在注册一下:

1 public static void RegisterRoutes(RouteCollection routes) { 2 routes.Add(new Route("SayHello", new CustomRouteHandler())); 3 routes.MapRoute("MyRoute", "{controller}/{action}/{id}", 4 new { controller = "Home", action = "Index", id = UrlParameter.Optional }); 5 }