跳至內容

ASP.NETMVCFramework

出自Taiwan Tongues 台語維基
這是此頁批准,以及是最近的修訂。

ASP . NET MVC Framework是略仔軟佇咧 ASP . NET 中所添加的一組類別庫,這組類別庫會使用 Model-View-Controller 的設計模式來開發 ASP . NET 的應用程式。伊佮現有的 ASP . NET 應用程式並無衝突,所以兩个人是會當並行的。ASP . NET MVC Framework 予人包裝佇 System . Web . Mvc . dll 中,並利用 ASP . NET Routing 來支援動作流和 URL Rewriting 的能力,予伊會當閣較倚 Web 的發展佮 Web 二鋪零的特性。對這多數有 ASP 開發經驗的開發人員來講看起來較袂生份,但是對著無接觸過像 ASP、PHP、JSP、Perl 這是 Web 開發工具的開發人員來講,相對的無簡單入門。ASP . NET MVC 的頭一个版本佇二空空九年三月十七日釋出 RTM 版本,上新的 ASP . NET MVC 五鋪二是二空一四年十二月二十四正式發行。

微軟於 ASP . NET Core 中提出後一代的 MVC 框架,這號做 ASP . NET Core MVC。

原理

ASP . NET MVC 是遵循軟體模式的 Model-View-Controller 來發展,其中 Model 講的是資料抑是業務邏輯元件,View 是呈現予使用者看的資訊,而且 Controller 是欲接取來自使用者的指令佮資料,並將 Model 佮 View 做整合的控制器,做侍服器接著著 ASP . NET MVC 應用程式的要求的時陣,侍服器(IIS)可以先用 UrlRoutingModule ( ASP . NET Routing 的 HTTP 模組 ),由伊來解析敢有包括 ASP . NET MVC 應用程式的 URL,若有,著會產生一个MvcRouteHandler東西,這个物件會裝載執行的必要資訊,並且會呼叫包括佇內底 URL 中的 Controller 的 Execute 方法來執行工課。

Controller物件是因為 ` IController ` 介面的規則所定義,提供針對 HTTP 要求做回應的一个執行工具,佇咧 ASP . NET MVC 中已經實作一个預設的類別 Controller,提供必要的基礎功能,另外嘛發展一个 Controller 工場,這號做 Controller Factory,以 ` IControllerFactory ` 介面定義,亦提供了DefaultControllerFactory,開發人員會當用基本的類別以及利用𪜶來衍生家己的 Controller 抑是 Controller Factory 來實作家己的控制器邏輯功能。

Model物件攏是為著 ASP . NET MVC 提供資料,毋過伊無基礎類別,是使用 . NET Framework 一般性的資料結構抑是這馬現代的 ADO . NET 資料物件,像講 List、Dictionary、DataTable、DataReader 佮 DataSet 等咧,當然嘛會當是家己開發的商業物件,遮的資料會透過 ASP . NET MVC 的ModelBinder這工具類別來佮 Controller 整合,ModelBinder 本身是支援泛型 ( Generic ) 的,因為各種型別的資料伊攏會當使用。佇咧 ASP . NET MVC 中提供一个DefaultModelBinder東西,會當支援大多數 . NET Framework 資料型別,以及陣列佮已經實作的親像 IList、IDictionary 以及 ICollection 等介面的東西。

Model 會佇咧 Controller 執行動作的時,做為一个 ActionResult 物件的方式傳轉來予 MvcHandler 東西,這个物件就會指定欲顯示 View 東西,親像下列程式碼所示講:


View東西以 ` IView ` 佮 ` IViewDataContainer ` 等介面為主,並且以 ASP . NET 的各式頭前捀介面為主要輸出工具,是因為 MVC 的 View 彈性化設計考量,以往佇咧 ASP . NET Web Form 的程式碼佮 HTML 分離模式會閣存在無閣有,是將程式碼佮 HTML 混合的方式設計,予開發人員會當閣較精確的著 View 進行控制,佇目前 ASP . NET MVC 支援的 View 有下列幾種:

  • . aspx 網頁,由ViewPage來支援。
  • . ascx 使用者控制項,由ViewUserControl來支援。
  • . master 主版頁面,由ViewMasterPage來支援。

彼每一个 View 物件攏會內含一个泛型的參數,用來裝載欲呈現的資料 ( 即 Model ),然後使用類似下跤的方式來呈現資料:

技術

佇咧 ASP . NET MVC 架構內底,除了 Controller、Model 佮 View 三个主要部份以外,閣包括真濟技術以予這三層得整合並互動的運作。

Controller

Controller 佇咧 ASP . NET MVC 應用程式中是負責中控的角色,嘛是對使用者捀 HTTP 要求的處理核心,所以有誠濟處理佮轉向 HTTP 要求的輔助技術佇咧 Controller 層次攏會用著。

ASP . NET 路是由技術

用來過濾使用者捀要求的 URL,而且藉著定義好的路由來表 ( route table ) 共要求導向至正確的 MVC Controller,並呼叫 Controller 中的 Execute 方法執行,而且 Execute 彼方法會共 HTTP 動作佮實際執行的指令交予正確的函式來執行。而通常伊一个 MVC 應用程式的 URL 攏會是類似按呢的 URL 格式:

` ` ` http : / / 一百二十七孵空 . 空七一 / ControllerName / ActionName / ActionParameters ` ` `

而且 MvcRouteHandler 會拆解 URL,揣出目標的 Controller,而且將 ActionName 以及 ActionParameters 傳予 Controller 中負責的函式(以 ActionName 來指定)。 比如講下列的 URL 會傳遞予 BlogController 的 GetList 方法:

` ` ` http : / / 一百二十七孵空 . 空七一 / Blog / GetList ` ` `

動作佮方法直接整合

ASP . NET MVC 利用中介資料的技術,直接共方法對應著指定的 HTTP 動詞 ( GET / POST / PUT / DELETE / HEAD 等 ),MvcHandler 會判斷要求的類別,閣共伊交予 URL 中指定的方法來處理。目前 MVC Framework 會當用下列的方式指定(攏包含講佇 HttpVerbs 列舉型別中):

  • ` HttpVerbs . Get `
  • ` HttpVerbs . Post `
  • ` HttpVerbs . Delete `
  • ` HttpVerbs . Put `
  • ` HttpVerbs . Head `

共資料模型佮展示層直接包裝

` ViewPage `、` ViewMasterPage `、` ViewUserControl ` 等展示物件攏支援泛型物件,會當直接裝載 Model 資料傳佇咧送到前端輸出,會當簡單來處理 Model 佮 View 之間整合的動作之間,只要一个參數就會當將資料傳予 View:


Model

佇咧 ASP . NET MVC 中,Model 相對無欲設,會使使用內建的資料結構猶閣有自訂的資料類別,嘛會當是一个商業的物件,所以 Model 的𩚨度真大,除了前講的資料結構外,微軟新發展的一寡資料存取方式嘛會當應用佇咧 Model 中,像講 ADO . NET Entity Framework 佮 LINQ to SQL 等技術。

另外咧,MVC 咧侍服捀資料驗證中,提供矣 ` ViewDataDictionary ` 類別,這類別有一个ModelState屬性,內含著 ` ModelStateDictionary ` 類別,開發人員會當用這个類別來控制資料驗證的結果,而且 View 中輸出驗證訊息的部份會佮此類別有關聯,像下列的程式:

佇咧 ASP . NET MVC 二孵空中,新增加一个會當直接予 MVC Framework 針對資料欄位進行驗證控制的模型,這號做 Model Validation,伊融合了在矣 . NET Framework 三人五 SP 一發表的 ASP . NET Dynamic Data Framework 中 Data Annotations ( 資料記號 ) 的特性,予開發人員會使只利用標記的方式來執行驗證,或者是利用自訂的程式碼來擴充資料記號的驗證行為。

View

因為 View 是直接呈現予使用者,因此佮使用者互動的部份攏愛由此層處理,包含資料的輸出猶閣有使用者捀操作為主的回應(譬如講令碼)等。

HTML 工具類別

HTML 家私類別佇咧 View 中間是重要的輸出家私,伊內底起輔助產生 HTML 標籤的工具辦法,多數的 HTML 語法攏會當利用伊來產生,包含親像連結 ( < a > )、表單 ( < form > ) 猶閣有表單控制項等等。HTML 工具是以 ` HtmlHelper ` 類別為核心,閣配合 System . Web . Mvc . Html 號名空間的方法,以延伸方法 ( Extension Method ) 的方式,予產生 HTML 的程式就有如呼叫方法般簡單:

資料驗證

View 的 HTML 工具會當配合 Model 處理資料驗證的結果,佇咧 ASP . NET 中常用的 ValidationSummary 佇遮嘛支援,而且 MVC 的架構予驗證資訊的輸出嘛閣較𩚨:

無仝類型的輸出

彼每一个 Controller 中負責回應的方法,攏會回傳一个 ActionResult 物件的資訊,ActionResult 是一个執行結果物件的封裝體,當 MvcHandler 執行指令接著 ActionResult 時,就會依照伊的內容來輸出資料。目前 MVC Framework 支援的 ActionResult 有下列幾種:

  • ` ViewResult ` 東西,這个物件內底載矣 ` IView ` 介面的資訊,以及 ` IViewEngine ` 的資訊,實際產生輸出資料的會是 IViewEngine,佮其指示的 View 東西。
  • ` PartialViewResult ` 東西,佮 ` ViewResult ` 相仝,但是伊回傳的是 " 部份展示 ",就算用者控制項的 View。
  • ` ContentResult ` 東西,裝載由使用者自訂的 Content-Type 佮資料。
  • ` EmptyResult ` 東西,表示不回傳任何物件。
  • ` HttpUnauthorizedReuslt ` 東西,表示動作無予授權(即 HTTP 四百空一)的錯誤訊息。
  • ` JavaScriptResult ` 東西,表示回傳的是 JavaScript 指令碼。
  • ` JsonResult ` 東西,表示回傳的是 JSON 資料。
  • ` FileResult ` 東西,表示回傳的是一个檔案的資料。
  • ` RedirectResult ` 東西,表示回傳的是一个重導向 ( HTTP Redirect ) 指令。
  • ` RedirectToRouteResult ` 東西,佮 RedirectResult 類似,但是伊是重導向予一个 Route 的路徑。

透過多類型的 ActionResult,開發人員會當自由決定欲回傳的資料的類型佮格式。

應用

目前小可仔軟有一个 Oxite 專案,是使用 ASP . NET MVCFramework 所開發的部落格 ia̋n-jín,啊若這个案已經予微微仔應用平台所採用,像講 MIX Online、PDC 二千空九、MIX Video 等官方網站攏是採用伊來開發。另外咧,stackoverflow . com 以及 codeplex . com 這兩个網站嘛是採用 ASP . NET MVC Framework。

版本的過程

授權

ASP . NET MVC Framework 雖然是 ASP . NET 的一部份,猶毋過伊的原始碼是透過 Microsoft Public License ( MS-PL ) 的授權模式公開,所以佇遮 MS-PL 授權的範圍內底,任何人是會當去檢視佮修改伊的原始碼的。

ASP . NET MVC Razor Engine

微軟佇咧二空一空年七月初二由 Scott Guthrie 發表新的 MVC 畫製 ia̋n-jín ( Render Engine ):Razor Engine,伊已經內底建佇咧 ASP . NET MVC 三更空中發布,伊具有下列功能:

一 . 閣較輕量化而且直覺的語法,減少佇咧 View 中輸出資料的時陣使用的語法,予 View 的指令更加簡潔,像使用 " @ " + 變數名稱的方式,就會使輸出程式中的變數,毋免閣用 < %   % > 來設定。若程式有足濟行,會用得使用 @ { } 的方式來設定。 二 . 容易學習。 三 . 會當相容佇這馬的程式語言 ( ex : C # )。 四 . 透過 Visual Studio,可享有 Intellisense 能力。 五 . 會當透濫 HTML 佮程式語言指令。 六 . 通用各種無仝款的文字編輯器編輯。 七 . 有單元測試的能力。

參考資料

外部網站

  • ASP . NET MVC 官方網站
  • MSDN ASP . NET Virtual Labs
  • ASP . NET MVC Documentations

View engines

  • MvcContrib
  • StringTemplate View Engine
  • Spark
  • NDjango
  • Naked Objects MVC
  • Razor(按算 ASP . NET MVC 三更零匯入)