ASP.NET Core MVC

基础建设

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 public void ConfigureServices(IServiceCollection services) 2 { 3     // 加入 ASP.NET Core MVC 服務 4     services.AddMvc(); 5 } 6  7 public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 8 { 9     // ...10     // 啟用 ASP.NET Core MVC11     app.UseMvc(routes =>12     {13         routes.MapRoute(14             name: "default",15             template: "{controller=Home}/{action=Index}/{id?}");16     });17 }
注册 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)，例如：
app.UseMvc(routes => {
    routes.MapRoute(
       name: "default",
       template: "{controller=Home}/{action=Index}/{id?}");});

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 差异相当小。
using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;using Microsoft.AspNetCore.Mvc;namespace WebApplication18.Controllers{
    public class HomeController : Controller
    {
        public IActionResult Index()
        {
            return View();
        }

        public IActionResult About()
        {
            ViewData["Message"] = "Your application description page.";

            return View();
        }

        public IActionResult Contact()
        {
            ViewData["Message"] = "Your contact page.";

            return View();
        }

        public IActionResult Error()
        {
            return View();
        }
    }}

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 5 也可以利用Child Action 加上Partial View 的机制来实作出与View Component 相同的功能，但基于关注点分离原则，若在Controller 中加入过多的Child Action 反而会造成Controller 职责过重，Controller 的程式码也会变得肥大，因此 Core MVC 加入这个新功能，每一个View Component 都是独立的后端程式，以一对一的方式对应View。
View Component 基本上可以看做是一个类似Controller 的元件，它也可以使用像ViewBag 或 TempData 这样的功能，不过它是由View 来唤起的，例如下列程式为View Component 的范例实作：
using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;using Microsoft.AspNetCore.Mvc;namespace HelloMvc.Components{    [ViewComponent(Name = "AddNumber")]
    public class AddNumberComponent : ViewComponent
    {
        public async Task<IViewComponentResult> InvokeAsync(int Number1, int Number2)
        {
            int result = Number1 + Number2;
            ViewBag.N1 = Number1;
            ViewBag.N2 = Number2;
            return View(result);
        }
    }}
View Component 可以由Controller 唤起 (回传ViewComponentResult) 或是由View 唤起 (使用 Razor 的 Component.InvokeAsync())，例如：
<div>@await Component.InvokeAsync("AddNumber", new { Number1 = 1, Number2 = 2})</div>

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() 进行包装，例如：
@using (Html.BeginForm("Login", "Account", new { returnurl = ViewData["ReturnUrl"] }, FormMethod.Post, new { @class = "form-horizontal" })){
  // ...}
但使用了Tag Helper 之后，View 上的程式码就可以移除，变成：
<form asp-controller="Account" asp-action="Login" asp-route-returnurl="@ViewData["ReturnUrl"]" method="post" class="form-horizontal">
...
</form>
其中的asp-controller、asp-action、asp-route-returnurl 即是使用Tag Helper 扩充而得。
Tag Helper 的实作与View Component 类似，它要求继承自Microsoft.AspNetCore.Razor.TagHelpers 内的TagHelper 类别，例如：
using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;using Microsoft.AspNetCore.Razor.TagHelpers;namespace HelloMvc.TagHelpers{
    public class EmailTagHelper : TagHelper
    {
        private const string EmailDomain = "contoso.com";

        // Can be passed via <email mail-to="..." />. 
        // Pascal case gets translated into lower-kebab-case.
        public string MailTo { get; set; }

        public override void Process(TagHelperContext context, TagHelperOutput output)
        {
            output.TagName = "a";    // Replaces <email> with <a> tag

            var address = MailTo + "@" + EmailDomain;
            output.Attributes.SetAttribute("href", "mailto:" + address);
            output.Content.SetContent(address);
        }
    }}
然后在View 中引用这个Tag Helper (可以在_ViewImport.cshtml 内引用或是在该View 中引用)，就可以直接使用自己定义的Tag 了。
<div>
    <h4><email mail-to="jason">support</email></h4></div>