//通过当前的请求上下文和控制器名称得到控制器的对象 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); }
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); }
//得到当前请求的控制器类型 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); }
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); }
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); }
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 }
public abstract void Execute(MyRouteData routeData);
public abstract void ExecuteResult(MyRouteData routeData);
public MvcHandler(MyRouteData routeData, HttpContextBase context) { MyRouteData = routeData; MyContext = context; }
//得到当前请求的控制器实例 private IController GetControllerInstance(MyRouteData routeData, Type controllerType) { var oRes = Activator.CreateInstance(controllerType) as IController; return(oRes); }
public IHttpHandler GetHttpHandler(MyRouteData routeData, HttpContextBase context) { return(new MvcHandler(routeData, context)); }