从C#角度 理解MVC原理:从view上请求到controller组织model,反映到view上
1、请求被UrlRoutingModule部件拦截——通过在Init()方法里注册HttpApplication对象的PostResolveRequestCache事件来实现拦截;
2、封装请求上下文HttpContext,成为HttpContextWrapper对象——UrlRoutingModule的Init()方法中调用事件;
3、根据当前HttpContext,从Routes集合中得到与当前请求URL相符合的RouteData对象——UrlRoutingModule的PostResolveRequestCache()方法;
4、将HttpContext请求和RouteData对象封装成RequestContext对象——UrlRoutingModule的PostResolveRequestCache()方法;
5、根据RequestContext对象,从RouteData的RouteHandler中获取IHttpHandeler——routeData.RouteHandler.GetHttpHandler(RequestContext)方法返回的是MVCHandler(继承IHttpHandler);
6、把请求交给MvcHandler(继承IHttpHandler)——context.RemapHandler(httpHandler),去执行IHttpHandler 的ProcessRequest(context)方法,处理http请求;
7、通过反射激活具体controller,执行具体action,返回model数据,显示在视图上。
{
7.1 ProcessRequestInit()方法,获取当前上下文HttpContext;
7.2 从路由对象RouteData中获取当前请求Controller名称——this.RequestContext.RouteData.GetRequiredString("controller");
7.3 获取Controller工厂对象;
7.4 根据RequestContext请求和Controller名称,从Controller工厂创建具体Controller对象;
7.5 执行控制器的Action——controller.Execute(context.Request.RequestContext) { requestContext.RouteData.GetRequiredString("action");}
}
总结: UrlRoutingModule拦截http请求,根据HttpContext请求,从RouteCollection中,找到RouteData对象,把请求和对象封装为RequestContext请求,再从RouteData对象找到MvcHandler,由UrlRoutingModule转到了MvcHandler;MvcHandler根据HttpContext,从RouteData对象中获取当前请求Controller名称,获取Controller工厂对象,创建具体Controller对象,执行具体action,返回model数据,显示在视图上。
注:大家可以参考 懒得安分 博主的mvc原理,讲得太好了。