MVC3 自定义路由 Kevin

一、 自定义路由需要继承RouteBase类

RouteBase类有两个抽象方法:1.GetRouteData和GetVirtualPath

GetRouteData用于重构RouteData数据,GetVirtualPath用于重写产生的URL。

下面通过一个例子来说明如何自定义自己的路由:

1. 新建一个Controller

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

2.自定义路由类

View Code
 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文件中注册自定义路由

View Code
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方法:

View Code
 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 }

在页面中添加连接:

View Code
1 @Html.ActionLink("Click me", "GetLegacyURL", new { legacyURL =
2 "~/articles/Windows_3.1_Overview.html" })

三、自定义路由处理类

Mvc默认使用 MvcRouteHandler来处理URL,同时,MVC框架允许我们自定义自己的RouteHandler类。我们只需要实现IRouteHandler类:

View Code
 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 }

然后在注册一下:

View Code
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 }
原文地址:https://www.cnblogs.com/kfx2007/p/2981898.html