Пример #1
0
        //通过当前的请求上下文和控制器名称得到控制器的对象
        public IController CreateController(MyRouteData routeData, string controllerName)
        {
            if (routeData == null)
            {
                throw new ArgumentNullException("MyRouteData");
            }

            if (string.IsNullOrEmpty(controllerName))
            {
                throw new ArgumentException("controllerName");
            }

            //得到当前的控制类型
            Type controllerType = GetControllerType(routeData, controllerName);

            if (controllerType == null)
            {
                return(null);
            }

            //得到控制器对象
            IController controller = GetControllerInstance(controllerType);

            return(controller);
        }
Пример #2
0
        public virtual void PostResolveRequestCache(HttpContextBase context)
        {
            //1.传入当前上下文对象,得到与当前请求匹配的RouteData对象
            MyRouteData routeData = RouteCollection.GetRouteData(context);

            if (routeData == null)
            {
                return;
            }

            //2.从RouteData对象里面得到当前的RouteHandler对象。
            IMyRouteHandler routeHandler = routeData.RouteHandler;

            if (routeHandler == null)
            {
                return;
            }

            //3.根据RequestContext对象得到处理当前请求的HttpHandler(MvcHandler)。
            IHttpHandler httpHandler = routeHandler.GetHttpHandler(routeData, context);

            if (httpHandler == null)
            {
                return;
            }

            //4.请求转到HttpHandler进行处理(进入到ProcessRequest方法)。这一步很重要,由这一步开始,请求才由UrlRoutingModule转到了MvcHandler里面
            context.RemapHandler(httpHandler);
        }
Пример #3
0
        //得到当前请求的控制器类型
        private Type GetControllerType(MyRouteData routeData, string controllerName)
        {
            //从路由配置信息里面读取命名空间和程序集
            object routeNamespaces = routeData.RouteValue["namespaces"];
            object routeAssembly   = routeData.RouteValue["assembly"];
            //requestContext.RouteData.Values.TryGetValue("namespaces", out routeNamespaces);
            //requestContext.RouteData.Values.TryGetValue("assembly", out routeAssembly);

            //通过反射得到控制器的类型
            var type = Assembly.Load(routeAssembly.ToString()).GetType(routeNamespaces.ToString() + "." + controllerName + "Controller", false, true);

            return(type);
        }
Пример #4
0
        private Type GetControllerType(MyRouteData routeData, string controllerName)
        {
            //从路由配置信息里面读取命名空间和程序集
            object routeNamespaces;
            object routeAssembly;

            routeData.RouteValue.TryGetValue("namespaces", out routeNamespaces);
            routeData.RouteValue.TryGetValue("assembly", out routeAssembly);

            var type = Assembly.Load(routeAssembly.ToString()).GetType(routeNamespaces.ToString() + "." + controllerName + "Controller");

            return(type);
        }
Пример #5
0
        public override void Execute(MyRouteData routeData)
        {
            //1.得到当前控制器的类型
            Type type = this.GetType();

            //2.从路由表中取到当前请求的action名称
            string actionName = routeData.RouteValue["action"].ToString();

            //3.从路由表中取到当前请求的Url参数
            object parameter = null;

            if (routeData.RouteValue.ContainsKey("parameters"))
            {
                parameter = routeData.RouteValue["parameters"];
            }
            var           paramTypes = new List <Type>();
            List <object> parameters = new List <object>();

            if (parameter != null)
            {
                var dicParam = (Dictionary <string, string>)parameter;
                foreach (var pair in dicParam)
                {
                    parameters.Add(pair.Value);
                    paramTypes.Add(pair.Value.GetType());
                }
            }

            //4.通过action名称和对应的参数反射对应方法。
            //这里第二个参数可以不理会action字符串的大小写,第四个参数决定了当前请求的action的重载参数类型
            System.Reflection.MethodInfo mi = null;
            if (routeData.RouteValue.ContainsValue(actionName) && routeData.RouteValueFirst.ContainsValue(actionName))
            {
                mi = type.GetMethod(actionName,
                                    BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase, null, paramTypes.ToArray(), null);
            }
            else
            {
                mi = type.GetMethod("To404",
                                    BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase, null, paramTypes.ToArray(), null);
            }

            //5.执行该Action方法
            var actionResult = mi.Invoke(this, parameters.ToArray()) as ActionResult;

            //6.得到action方法的返回值,并执行具体ActionResult的ExecuteResult()方法。
            actionResult.ExecuteResult(routeData);
        }
Пример #6
0
        public override void Execute(MyRouteData routeData)
        {
            #region V2.0
            ////反射得到Action方法
            //var typeController = this.GetType();
            //var actionName= requestContext.RouteData.GetRequiredString("action");
            ////执行该Action方法
            //var methodInfo = typeController.GetMethod(actionName);
            //methodInfo.Invoke(this, new object[] { });
            #endregion

            #region V3.0
            //1.得到当前控制器的类型
            Type type = this.GetType();
            //2.从路由表中取到当前请求的action名称
            string actionName = routeData.RouteValue["action"].ToString();

            //3.从路由表中取到当前请求的Url参数
            object parameter = null;
            if (routeData.RouteValue.ContainsKey("parameters"))
            {
                parameter = routeData.RouteValue["parameters"];
            }
            var           paramTypes = new List <Type>();
            List <object> parameters = new List <object>();
            if (parameter != null)
            {
                var dicParam = (Dictionary <string, string>)parameter;
                foreach (var pair in dicParam)
                {
                    parameters.Add(pair.Value);
                    paramTypes.Add(pair.Value.GetType());
                }
            }

            //4.通过action名称和对应的参数反射对应方法。
            //这里第二个参数可以不理会action字符串的大小写,第四个参数决定了当前请求的action的重载参数类型
            System.Reflection.MethodInfo mi = type.GetMethod(actionName,
                                                             BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase, null, paramTypes.ToArray(), null);

            //5.执行该Action方法
            mi.Invoke(this, parameters.ToArray());//调用方法
            #endregion
        }
Пример #7
0
 public abstract void Execute(MyRouteData routeData);
Пример #8
0
 public abstract void ExecuteResult(MyRouteData routeData);
Пример #9
0
 public MvcHandler(MyRouteData routeData, HttpContextBase context)
 {
     MyRouteData = routeData;
     MyContext   = context;
 }
Пример #10
0
        //得到当前请求的控制器实例
        private IController GetControllerInstance(MyRouteData routeData, Type controllerType)
        {
            var oRes = Activator.CreateInstance(controllerType) as IController;

            return(oRes);
        }
Пример #11
0
 public IHttpHandler GetHttpHandler(MyRouteData routeData, HttpContextBase context)
 {
     return(new MvcHandler(routeData, context));
 }