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 的程式碼[1]:
publicvoidConfigureServices(IServiceCollectionservices){// 加入 ASP.NET Core MVC 服務services.AddMvc();}publicvoidConfigure(IApplicationBuilderapp,IHostingEnvironmentenv,ILoggerFactoryloggerFactory){// ...// 啟用 ASP.NET Core MVCapp.UseMvc(routes=>{routes.MapRoute(name:"default",template:"{controller=Home}/{action=Index}/{id?}");});}
註冊 ASP.NET Core MVC 服務後,ASP.NET Core 會自動將 MVC 的執行引擎加入 ASP.NET Core 的管線式相依注入 (Pipeline-based Dependency Injection) 的服務清單內,以開始提供 MVC 的相關服務。
路由
ASP.NET Core MVC 強化了 ASP.NET Routing 技術,使其更具彈性,除了原有的由起始類別加入的路由外,亦全面整合了之前在 ASP.NET MVC 5.2 / Web API 2.1 起支援的屬性路由能力 (Attribute Routing),這表示開發人員不一定需要在起始類別註冊 MVC 時定義路由,只需要在 Controller 內加入路由設定即可,但官方還是建議至少加入預設路由 (default routes)[2],例如:
Tag Helper [6]是 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() 進行包裝,例如:
其中的 asp-controller、asp-action、asp-route-returnurl 即是使用 Tag Helper 擴充而得。
Tag Helper 的實作與 View Component 類似,它要求繼承自 Microsoft.AspNetCore.Razor.TagHelpers 內的 TagHelper 類別,例如:
usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Threading.Tasks;usingMicrosoft.AspNetCore.Razor.TagHelpers;namespaceHelloMvc.TagHelpers{publicclassEmailTagHelper:TagHelper{privateconststringEmailDomain="contoso.com";// Can be passed via <email mail-to="..." />. // Pascal case gets translated into lower-kebab-case.publicstringMailTo{get;set;}publicoverridevoidProcess(TagHelperContextcontext,TagHelperOutputoutput){output.TagName="a";// Replaces <email> with <a> tagvaraddress=MailTo+"@"+EmailDomain;output.Attributes.SetAttribute("href","mailto:"+address);output.Content.SetContent(address);}}}
然後在 View 中引用這個 Tag Helper (可以在 _ViewImport.cshtml 內引用或是在該 View 中引用),就可以直接使用自己定義的 Tag 了。