第十四节:再探MVC中路由的奥秘
一. 基于RouteBase扩展
1. 原理
扩展RouteBase,同样使用的是MVC框架提供的MvcRouteHandler进行处理。
2. 步骤
1. 新建YpfRoute1类,继承RouteBase类型,并覆写里面的两个抽象方法, 在GetRouteData编写业务逻辑,(这里是禁止Chrome浏览器访问),通过RouteData添加地址,并返回。
1 /// <summary> 2 /// 基于RouteBase进行扩展 3 /// </summary> 4 public class YpfRoute1 : RouteBase 5 { 6 /// <summary> 7 /// 解析路由信息 8 /// </summary> 9 /// <param name="httpContext"></param> 10 /// <returns></returns> 11 public override RouteData GetRouteData(HttpContextBase httpContext) 12 { 13 //编写自己业务逻辑(这里禁止Chrome浏览器的访问 不是很准确) 14 if (httpContext.Request.UserAgent.IndexOf("Chrome")>=0) 15 { 16 //返回指定的页面 17 RouteData rd = new RouteData(this, new MvcRouteHandler()); 18 rd.Values.Add("controller","Route"); 19 rd.Values.Add("action", "RefuseView"); 20 return rd; 21 } 22 23 return null; 24 } 25 26 /// <summary> 27 /// 指定虚拟路径处理(这里暂不使用) 28 /// </summary> 29 /// <param name="requestContext"></param> 30 /// <param name="values"></param> 31 /// <returns></returns> 32 public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values) 33 { 34 throw new NotImplementedException(); 35 } 36 }
2. 在RouteConfig文件中新建RefuseChrome方法,并在该方法中添加YpfRoute1类。
1 /// <summary> 2 /// 基于RouteBase进行扩展的路由 3 /// </summary> 4 /// <param name="route"></param> 5 public static void RefuseChrome(RouteCollection route) 6 { 7 route.Add("myRoute", new YpfRoute1()); 8 }
3. 在Global中将RefuseChrome方法注册进去。
注意:是放到系统自带路由注册的上面还是下面,哪个在上,哪个先执行。
4. 测试
使用Chrome浏览器打开任何页面,均跳转到拒绝访问页面。
二. 基于IRouteHandler扩展
1. 原理
扩展IRouteHandler并且自定义IHttpHandler 。
2. 步骤
1. 新建YpfRoute1类,实现接口IRouteHandler,并实现里面的GetHttpHandler方法。
2. 自定义ypfHttpHandler类,并实现IhttpHandler接口。
1 /// <summary> 2 /// 扩展IRouteHandler和自定义IHttpHandler 3 /// </summary> 4 public class YpfRoute2 : IRouteHandler 5 { 6 public IHttpHandler GetHttpHandler(RequestContext requestContext) 7 { 8 return new ypfHttpHandler(); 9 } 10 } 11 12 public class ypfHttpHandler : IHttpHandler 13 { 14 15 bool IHttpHandler.IsReusable 16 { 17 get 18 { 19 return false; 20 } 21 } 22 23 void IHttpHandler.ProcessRequest(HttpContext context) 24 { 25 string url = context.Request.Url.AbsoluteUri; 26 context.Response.Write(string.Format("这里是ypf定制:{0}", this.GetType().Name)); 27 context.Response.Write((string.Format("当前地址为:{0}", url))); 28 29 context.Response.End(); 30 } 31 }
3. 在RouteConfig文件中新建RegisterSpecialRoute方法,并在该方法中添加YpfRoute1类(注册规则,并使用RouteTable往里添加)
1 /// <summary> 2 /// 扩展IRouteHandler和自定义IHttpHandler 3 /// </summary> 4 /// <param name="routes"></param> 5 public static void RegisterSpecialRoute(RouteCollection routes) 6 { 7 Route route = new Route("Ypf/{other}",new YpfRoute2()); 8 RouteTable.Routes.Add(route); 9 }
4. 在Global中将RefuseChrome方法注册进去,注意:是放到系统自带路由注册的上面还是下面,哪个在上, 哪个先执行。
5. 访问地址:http://localhost:7559/Ypf/1 ,统一跳转到指定页面显示指定的信息(地址中的 1 可以换成任何信息)