第十四节:再探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 可以换成任何信息)

 

 

 

 

 

posted @ 2017-12-17 18:56  Yaopengfei  阅读(862)  评论(1编辑  收藏  举报