在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
ASP.NET MVC由以下两个核心组成部分构成:
!!阅读本文前请先弄明白asp.net执行的流程及httpmodule与httphandler的作用。 下面是进行路由转换时相关类的简化结构图:
整个ASP.NET MVC系统的路由信息全部存放在RoteTable这个类的静态变量Routes(为一个RouteDictionary类型)中,网站开始运行时,在Application_Start中对路由进行注册: RouteTable.Routes.Add("default", new Route{Url="{controller}/{action}"});
当一个URL请求到来时,被UrlRoutingModule拦截,拦截后执行流程如下:
执行时序图如下图所示:
UrlRoutingModule的代码如下: HttpContextWrapper httpContext = new HttpContextWrapper(HttpContext.Current); RouteData routeData = RouteTable.Routes.GetRouteData(httpContext); RequestContext requestContext = new RequestContext{ data = routeData, context= httpContext}; IHttpHandler handler = routeData.RouteHandler.GetHttpHandler(requestContext); httpContext.RemapHandler(handler);
经过上面最后一步,执行HttpHandle后,程序正式进入Controller激活里面,相关类关系如下图所示:
同URL路由一样,MVC初始化时,也需要注册控制器的一些信息,这里是要让框架知道默认的控制器工厂是什么,所以在Application_Start中: ControllerBuilder.Current.SetControllerFactory(new DefaultControllerFactory());
程序通过上面的URL路由转换后,进入HttpHandle中,经过以下步骤实现对Controller的激活:
在自定义的MvcHandler中,代码如下: string controllerName =this.Requestcontext.RouteData.Controller; IControllerFactory factory = ControllerBuilder.Current.GetControllerFactory();
一个典型的IActionInvoker接口实现ControllerActionInvoker的InvokeAction方法如下: public void InvokeAction(ControllerContext controllerContext, string actionName) { //找到Action方法 MethodInfo method = controllerContext.Controller.GetType().GetMethods() .First(m=>string.Compare(actionName,m.Name,true)==0); //获取Action参数,并进行Model绑定 List<object> parameters = new List<object>(); foreach(ParameterInfo parameter in method.GetParameters()) { parameters.Add(this.ModelBinder.BindModel(controllerContext, parameter.Name, parameter.ParameterType)); } //执行Action,并得到ActionResult ActionResult actionResult = method.Invoke(controllerContext.Controller, parameters.ToArray()) as ActionResult; //最终ActionResult用HttpResponse将数据传回客户进行显示 actionResult.ExecuteResult(controllerContext); } 最终形成一个Http Response传回到客户端!! 以上即为我整理的ASP.NET MVC的两个核心流程,希望新手看的明白,老手多多指点其中的问题,谢谢!!有时间会继续放出MVC其它核心技术。如Model绑定、数据验证等,同时认真向Artech学习!!!! |
请发表评论