ASP.NET MVC必須知道的那些事!

MVC的由來:

      在MVC模式以前,View界面的呈現、用戶交互操做的捕捉與相應、業務流程的執行以及數據的存儲等都是在一塊兒的,這種設計模式叫自治視圖。設計模式

這重設計模式主要存在三大弊端:瀏覽器

  1. 重用性:業務邏輯與UI是不相關的,若是將業務邏輯與UI綁定在一塊兒,業務邏輯將沒法被重用。
  2. 穩定性:業務邏輯、UI邏輯、視圖界面三者的穩定性不一樣,綁定在一塊兒會由最差的部分影響到總體,即「短板理論」。(就像一個壞木桶裏的水,會從缺口的最低處先流出來)
  3. 可測試性:當UI與邏輯部分綁定在一塊兒,極大的增長了測試難度。

所以,爲了解決這些問題,有人採用了關注點分離的原則,將視圖界面、業務邏輯、UI邏輯三者分離開,並採用合理的交互模式將他們之間的依賴度降到了最低。這種模式就是MVC。服務器

 

什麼是MVC模式:

       MVC分別表明着Model、View、Controller,從人機交互的角度來講,View會捕獲到用戶的操做直接發給Controller,Controller會主動去完成相應的UI邏輯,但若是設計到了業務功能,框架

Controller還會調用Model來合做完成。在完成相應的UI邏輯後,Controller根據須要控制原View或者建立新的View對用戶操做予以響應。函數

 

什麼是ASP.NET MVC:

一句話歸納: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是如何運行的:

當一個用戶請求提交上來後,ASP.NET MVC會針對當前請求實施路由解析,解析的目標就是找到用戶須要的Controller並激活它,執行對應的Action方法,最終返回用戶須要的東西。spa

也就是說,當ASP.NET MVC接收到抵達的請求後,首要任務就是經過該請求解析獲得對應的Controller和Action名稱,那麼它是如何解析的呢?這就要了解一下Asp.Net MVC的路由系統了。設計

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對象的激活是經過工廠模式實現的,在激活Controller的工廠中有一個IControllerFactory接口,該接口具備惟一方法CreateController,根據當前請求的上下文和經過路由解析獲得的Controller名稱來激活相應的Controller對象。代碼以下:

 

Public interface IControllerFactory
{
    IController CreateController(RequestContext requestContext,
       string controllerName);
}

 

Action的執行:

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名稱。

相關文章
相關標籤/搜索