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

     

  • 相关阅读:
    记录按钮点击次数,点击三次之后跳转页面
    HTML拖放
    .Net实现发送邮件功能
    HTTP 400 错误
    方法(参数的传递)
    方法
    c# 属性 (get、set)
    Python和C++交互
    从Windows远程Ubuntu
    Eclipse+Tomcat WEB开发配置
  • 原文地址:https://www.cnblogs.com/yaopengfei/p/8052880.html
Copyright © 2020-2023  润新知