ASP.NETCoreMVC
ASP . NET Core MVC是 ASP . NET Core 內,提供予 Web 應用程式開發的框殼,伊會當替 ASP . NET MVC 的後繼版本,其主要的功能生湠自 ASP . NET MVC,但是伊除了是 ASP . NET Core 外,也將 ASP . NET MVC 佮類似平台進行矣整合,譬如講負責 View 的 ASP . NET Web Pages 猶閣有負責 RESTful API 的 ASP . NET Web API,攏佮 ASP . NET Core MVC 的核心合併,所以佇遮 ASP . NET Core MVC 中將會當做伙用 MVC 網頁以及 RESTful API。
相關組件
ASP . NET Core MVC 包括著後列的組件,是因為 . NET Core 的精神,只有需要用著的才會使加入來參考 ( 佇咧 project . json ),所以開發者會當自由來選擇,毋免共所有的組件攏加入來。
基礎建設
ASP . NET Core MVC 採用 ASP . NET Core 做基礎,所以享受內建的相依注入能力 ( Dependency Injection ),ASP . NET Core MVC 本身嘛是 ASP . NET Core 這个服務之一,因此必須愛佇 ASP . NET Core 的起先類別中註冊並使用 MVC,才會使享有 MVC 的功能。下列例就算講佇一个 ASP . NET Core 的程式的起始類別 ( 通常予人號名做 Startup ) 中註冊並啟用 ASP . NET Core MVC 的程式碼:
註冊 ASP . NET Core MVC 服務了後,ASP . NET Core 會自動將 MVC 的執行 ia̋n-jín 加入 ASP . NET Core 的管線式不止仔注入 ( Pipeline-based Dependency Injection ) 的服務清單內,以開始提供 MVC 的相關服務。
路由
ASP . NET Core MVC 強化去矣 ASP . NET Routing 技術,使其他閣較有伸勼,除了原本有的由起先類別加入的路由外,亦全面整合了進前咧 ASP . NET MVC 五孵二 / Web API 學校做伙支援的屬性路是由能力 ( Attribute Routing ),這表示開發人員無一定愛做伙納冊的 MVC 時定義路由,只要佇咧 Controller 內加入路由設定會當,毋過官方猶是建議至少加入預設路由 ( default routes ),比如講:
Controller
ASP . NET Core MVC 可同時支援 MVC 本身的功能佮 Web API 的功能,𪜶攏源自仝款的 Controller 基底類別,這款的物件已經予人重新實作,以支援一般的 View 以及 RESTful API 的回傳值,微軟亦重新定義矣 ActionResult 類別,提出新的 IActionResult 介面,但是開發人員無一定愛回傳 IActionResult 介面,嘛會當直接回傳 . NET 內底起的資料型態,Controller 伊會自動共對應 Content Result。雖然微軟仔建議以 IActionResult 為傳回型別,但是原本的 ActionResult 型別猶閣適用。
下列程式是一個標準的 ASP . NET Core MVC Controller 的實作,和 ASP . NET MVC 差異相當細。
Model
ASP . NET Core MVC 的 Model 佮 ASP . NET MVC 最使用的概念類似,官方雖然建議使用 Entity Framework Core,毋過煞毋是強制,開發者會使依應用程式家己需求來定義 Model,嘛會當將 Model 徙去別的類別庫內佮其他專案共用。
是因為關注點分離的需要,佇咧 MVC 應用程式內底會依照 View 的需求另外建立單獨的 Model,此類 Model 這號做 View Model,猶毋過 ASP . NET Core MVC 嘛無針對這个做特別的限制。
View
ASP . NET Core MVC 的 View 除了由 ASP . NET MVC 衍生來的標準的 View 功能外,另外新加數項 View 的功能,包含 View Component 以及 Tag Helper。
View Component
View Component ( 檢視元件 ) 佮原有的 Partial View ( 部份檢視 ) 相當的類似,MVC 五嘛會當利用 Child Action 加上 Partial View 的機制來實作出佮 View Component 仝款的功能,但因為關注點分離原則,若佇咧 Controller 加入過多的 Child Action 顛倒會造成 Controller 職責傷重,Controller 的程式碼嘛會變較肥,所以 Core MVC 加入這个新功能,彼每一个 View Component 攏是獨立的後端程式,以一對一的方式對應 View。
View Component 基本上會當看做是一个類似 Controller 的元件,伊嘛會使用像 ViewBag 抑是 TempData 這種的功能喔,猶毋過伊是由 View 來喚起來的,像下列程式為啥物 View Component 的範例實作:
View Component 會當由 Controller 喚起來 ( 回傳 ViewComponentResult ) 抑是講由著 View 喚起來 ( 使用 Razor 的 Component . InvokeAsync ( ) ),比如講:
Tag Helper
Tag Helper 是 ASP . NET Core MVC 加入的上有威力的 View 功能,佇咧猶未 Tag Helper ( 即 ASP . NET MVC ) 的時陣,當 View 伊的需要的功能愈來愈濟的時陣,一張 View ( cshtml / vbhtml ) 會充斥著 Razor 程式碼抑是 Partial View 的呼叫,予規个 View 顯得相當的凌亂,而且 Tag Helper 所提供的功能就是直接基於 HTML Tag 本身進行處理,毋但會當擴充現有的 tag,嘛會使家己定家己的 tag,比如講 ASP . NET MVC 時期的表單,大多會用 @ Html . BeginForm ( ) 進行包裝,比如講:
猶毋過使用矣 Tag Helper 了後,View 上的程式碼就會當徙掉,變做是:
內底的 asp-controller、asp-action、asp-route-returnurl 就算使用 Tag Helper 擴充得著。
Tag Helper 的實作佮 View Component 類似,伊要求繼承自 Microsoft . AspNetCore . Razor . TagHelpers 內的 TagHelper 類別,比如講:
然後佇 View 中引用這 Tag Helper ( 會當佇 \ _ ViewImport . cshtml 內底引用抑是佇該當 View 中引用 ),就會使直接使用家己定義的 Tag 了。
相依照注入功能
因為惠 ASP . NET Core 的基礎建設,ASP . NET Core MVC 會當充份享有基礎建設所支援的相依注入能力,佇起始類別中加入對服務的註冊,就會當佇 Controller 佮 View 中使用註冊的類別。
比如講下列程式會佇服務清單內底加入一个自訂的類別:
若欲佇 Controller 中使用這號註冊的服務,會當使用下列三種方式:
- 建構式注入 ( Constructor Injection ):佇咧 Controller 的建構式內底加入該服務的參數,當 Controller 予人生成的時陣,ASP . NET Core MVC 會由服務清單中取出指定的介面物件。
- 方法注入 ( Method Injection ):佇咧 Controller 的方法內底加入 [FromService] 的修飾,ASP . NET Core MVC 若是發現方法內底有按呢的修飾時就會由服務清單內底提出指定的介面物件。
- 屬性注入 ( Property Injection ):佇咧 Controller 的屬性以 [FromService] 修飾,ASP . NET Core MVC 若發現屬性中有按呢的修飾時就會由服務清單中取出指定的介面物件。
比如講:
若欲佇 View 中使用,著愛用 @ inject 指令指定服務,紲落就會當使用此變數來操作服務。