zoukankan      html  css  js  c++  java
  • MVC路由 路由的三种扩展 替换MVC内置的Handler

    Global.asax 是 程序入口文件 

    路由配置   为什么localhost:8088/Home/Index/1 能返问到我们写的   

         会去掉前缀跟端口号  变成Home/Index/1 用这个跟路由规则进行匹配

     **************路由扩展的三大层面

    1. 直接用routers.MapRoute进行扩展   (这里定义的规则在源码中就是生成一个Route)

    2. 扩展Route

        2.1 创建一个扩展规则 添加到RouteData中  这个对象就是存放的路由规则   

          只要发起请求的浏览器版本为这个的  给他指定路由规则

        public class MyRoute : RouteBase
        {
            public override RouteData GetRouteData(HttpContextBase httpContext)
            {
                if (httpContext.Request.UserAgent.IndexOf("Chrome71.0.3578.98") >= 0)
                {
                    RouteData rd = new RouteData(this, new MvcRouteHandler());
                    rd.Values.Add("controller", "Jcb");
                    rd.Values.Add("action", "Index");
                    return rd;
                }
                return null;
            }
    
            public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
            {
                //这里要改成返回null  不然会报错
                return null;
            }
        }

      2.2在RouteConfig中把对象添加到RouteCollection中

        /// <summary>
        /// 路由配置
        /// </summary>
        public class RouteConfig
        {
            public static void RegisterMyRoutes(RouteCollection routes)
            {
                routes.Add(new MyRoute());
            }

      2.3在Globl启动配置中注册路由

            protected void Application_Start()
            {
                AreaRegistration.RegisterAllAreas();//注册区域路由
                GlobalConfiguration.Configure(WebApiConfig.Register);//注册webapi路由
                FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);//
    
                RouteConfig.RegisterMyMVCHandler(RouteTable.Routes);
                RouteConfig.RegisterMyRoutes(RouteTable.Routes);
                RouteConfig.RegisterRoutes(RouteTable.Routes);//注册路由
                BundleConfig.RegisterBundles(BundleTable.Bundles);
                ControllerBuilder.Current.SetControllerFactory(new UnityControllerFactory());//替换默认的控制器工厂
    
                //IOCConfig.InitIOCContainer();
            }

    3.扩展Handler 替换掉MVC框架中的MVCHandler

      3.1.配置扩展的Handler

          只要访问的地址 控制器是Jcb 就使用自定义的Handler来处理这次请求   之间不用MVC内置的Handler

        /// <summary>
        /// 扩展IRouteHandler,
        /// 扩展IHttpHandler
        /// </summary>
        public class ElevenRouteHandler : IRouteHandler
        {
            public IHttpHandler GetHttpHandler(RequestContext requestContext)
            {
                return new ElevenHttpHandler(requestContext);
            }
        }
    
        /// <summary>
        /// 还是我们熟悉的handler
        /// </summary>
        public class ElevenHttpHandler : IHttpHandler
        {
            public ElevenHttpHandler(RequestContext requestContext)
            {
                Console.WriteLine("构造我的Handler");
            }
    
            public void ProcessRequest(HttpContext context)
            {
                string url = context.Request.Url.AbsoluteUri;
                context.Response.Write(string.Format("这里是我的定制:{0}", this.GetType().Name));
                context.Response.Write((string.Format("当前地址为:{0}", url)));
    
                context.Response.End();
            }
    
            public virtual bool IsReusable
            {
                get
                {
                    return false;
                }
            }
        }

      3.2.在RouteConfig配置中添加

            public static void RegisterMyMVCHandler(RouteCollection routes)
            {
                routes.Add(new Route("Jcb/{*Info}", new ElevenRouteHandler()
                    ));
            }

      3.3在Globl中注册

            protected void Application_Start()
            {
                AreaRegistration.RegisterAllAreas();//注册区域路由
                GlobalConfiguration.Configure(WebApiConfig.Register);//注册webapi路由
                FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);//
    
                RouteConfig.RegisterMyMVCHandler(RouteTable.Routes);
                RouteConfig.RegisterMyRoutes(RouteTable.Routes);
                RouteConfig.RegisterRoutes(RouteTable.Routes);//注册路由
                BundleConfig.RegisterBundles(BundleTable.Bundles);
                ControllerBuilder.Current.SetControllerFactory(new UnityControllerFactory());//替换默认的控制器工厂
    
                //IOCConfig.InitIOCContainer();
            }
  • 相关阅读:
    DHCP原理和配置
    汇编学习1--寄存器学习
    关于ZF2中一点感悟,service_manager
    PHP太怪了,in_array() ,strpos,
    MySql中的skip-name-resovle
    好几天没有写随笔了,今天打开了,随便留点什么吧
    今天是第二次登录,随便写点东西
    我的博客开通了.....,以前也开通了博客,但从来都没有写过,从今天起,希望自己能坚持下去,不断的积累自己技术水平
    luogu 1258 小车问题 小学奥数(?)
    luogu 3406 海底高铁 前缀和
  • 原文地址:https://www.cnblogs.com/jiangchengbiao/p/10222183.html
Copyright © 2011-2022 走看看