從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原理,講得太好了。