在MVC模式以前,View界面的呈現、用戶交互操做的捕捉與相應、業務流程的執行以及數據的存儲等都是在一塊兒的,這種設計模式叫自治視圖。設計模式
這重設計模式主要存在三大弊端:瀏覽器
所以,爲了解決這些問題,有人採用了關注點分離的原則,將視圖界面、業務邏輯、UI邏輯三者分離開,並採用合理的交互模式將他們之間的依賴度降到了最低。這種模式就是MVC。服務器
MVC分別表明着Model、View、Controller,從人機交互的角度來講,View會捕獲到用戶的操做直接發給Controller,Controller會主動去完成相應的UI邏輯,但若是設計到了業務功能,框架
Controller還會調用Model來合做完成。在完成相應的UI邏輯後,Controller根據須要控制原View或者建立新的View對用戶操做予以響應。函數
一句話歸納:ASP.NET MVC就是創建在ASP.NET平臺上,基於MVC模式的,Web應用框架。學習
詳細點說:ASP.NET平臺採用管道式設計,具備良好的擴展性。整個ASP.NET MVC框架就是經過自定義ASP.NET的HttpModule和HttpHandler這兩個核心組件而創建的。測試
注:MVC中的Model主要體現爲維持應用狀態並提供業務功能,但ASP.NET MVC中的Model與之是不一樣的,後者僅僅是綁定到View上的數據而已,二者並非一回事,在學習理解過程當中要格外注意,不要混淆。url
當一個用戶請求提交上來後,ASP.NET MVC會針對當前請求實施路由解析,解析的目標就是找到用戶須要的Controller並激活它,執行對應的Action方法,最終返回用戶須要的東西。spa
也就是說,當ASP.NET MVC接收到抵達的請求後,首要任務就是經過該請求解析獲得對應的Controller和Action名稱,那麼它是如何解析的呢?這就要了解一下Asp.Net MVC的路由系統了。設計
路由是幹什麼的?
對於ASP.NET MVC應用來講,來自瀏覽器的請求老是指向定義在某個Controller類型中的某個Action方法,請求URL與目標Controller/Action之間的映射就須要路由來實現。
路由是如何工做的?
在ASp.NET MVC的App_Start文件夾的RouteConfig 中有以下一個靜態函數
public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); }
這就是一個路由註冊的過程,路由註冊的核心在於根據提供的路由規則(路由模板、約束、默認值等)建立一個Route對象,並將其添加到全局路由表中。
什麼是全局路由表?它是作什麼的?
全局路由表是由ASP.NET定義的,路由表中的每一個Route對象包含一個路由模板,Controller和Action的名字以佔位符的形式,即{controller}{action}的形式定義在模板中,對於
每個抵達的HTTP請求,路由系統會遍歷路由表並找到一個具備與當前請求URL模式相匹配的Route對象,而後利用它解析出以Controller和Action名稱爲核心的路由數據。
MapRoute()方法是作什麼的?
這個方法的意義在於向路由系統中添加自定義的一個URL映射規則。怎麼添加的呢?這是根據系統上下文中的RouteTable對象中的RouteCollection類型的屬性Routes,而在MapRoute()方法中的實現說白了就是根據參數生成Route對象,而且添加Route對象到服務器中。
簡單來講,這段代碼實現的功能就是按{controller}/{action}/{id}這種格式解析URL地址,獲得對應的Controller和Action。若是沒有,則跳轉默認地址,即/Home/Index。
經過路由系統獲得了須要的Controller和Action名稱後,接下來要作的就是激活Controller對象,執行Action方法了。
Controller對象的激活是經過工廠模式實現的,在激活Controller的工廠中有一個IControllerFactory接口,該接口具備惟一方法CreateController,根據當前請求的上下文和經過路由解析獲得的Controller名稱來激活相應的Controller對象。代碼以下:
Public interface IControllerFactory { IController CreateController(RequestContext requestContext, string controllerName); }
Action的執行主要是經過Controller的基類ControllerBase中的Execute方法來執行的,若是目標Action方法返回類型爲ActionResult,則還須要執行該ActionResult對象對當前請求予以響應。
在ASP.NET MVC框架中,兩種狀況的執行都是經過ActionInvoke對象來完成的。
public interface IActionInvoker { void InvokeAction(ControllerContext controllerContext,string actionName); }
ActionInvoke對象中定義了一個接口IActionInvoker,該接口定義了惟一的方法InvokeAction,該方法第一個參數爲當前Controller的上下文對象,第二個參數爲須要激活的Action名稱。