第十四節:再探MVC中路由的奧祕

一. 基於RouteBase擴展瀏覽器

1. 原理框架

   擴展RouteBase,一樣使用的是MVC框架提供的MvcRouteHandler進行處理。ide

2. 步驟測試

  1. 新建YpfRoute1類,繼承RouteBase類型,並覆寫裏面的兩個抽象方法, 在GetRouteData編寫業務邏輯,(這裏是禁止Chrome瀏覽器訪問),經過RouteData添加地址,並返回。this

 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類。url

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方法註冊進去。spa

  注意:是放到系統自帶路由註冊的上面仍是下面,哪一個在上,哪一個先執行。code

 

4. 測試orm

  使用Chrome瀏覽器打開任何頁面,均跳轉到拒絕訪問頁面。blog

 

二. 基於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 能夠換成任何信息)

 

 

 

 

相關文章
相關標籤/搜索