程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> ASP.NET MVC原理,asp.netmvc原理

ASP.NET MVC原理,asp.netmvc原理

編輯:關於.NET

ASP.NET MVC原理,asp.netmvc原理


僅此一文讓你明白ASP.NET MVC原理

 

ASP.NET MVC由以下兩個核心組成部分構成:

!!閱讀本文前請先弄明白asp.net執行的流程及httpmodule與httphandler的作用。

下面是進行路由轉換時相關類的簡化結構圖:

http://www.cnblogs.com/DotCpp/

 

 整個ASP.NET MVC系統的路由信息全部存放在RoteTable這個類的靜態變量Routes(為一個RouteDictionary類型)中,網站開始運行時,在Application_Start中對路由進行注冊:

RouteTable.Routes.Add("default", 
      new Route{Url="{controller}/{action}"});

 

當一個URL請求到來時,被UrlRoutingModule攔截,攔截後執行流程如下:

執行時序圖如下圖所示:

http://www.cnblogs.com/DotCpp/

 

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激活裡面,相關類關系如下圖所示:

http://www.cnblogs.com/DotCpp/

 

同URL路由一樣,MVC初始化時,也需要注冊控制器的一些信息,這裡是要讓框架知道默認的控制器工廠是什麼,所以在Application_Start中:

ControllerBuilder.Current.SetControllerFactory(new DefaultControllerFactory());

程序通過上面的URL路由轉換後,進入HttpHandle中,經過以下步驟實現對Controller的激活:

http://www.cnblogs.com/DotCpp/

在自定義的MvcHandler中,代碼如下:

string controllerName =this.Requestcontext.RouteData.Controller;
IControllerFactory factory = ControllerBuilder.Current.GetControllerFactory();
//通過controllerName得到Control(如HomeController) IController controller = controllerFactory.CreateController(this.RequestContext,controllerName); controller.Execute(this.RequestContext);

 

一個典型的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傳回到客戶端!!

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved