1. 程式人生 > >ASP.NET Core 中文文件 第四章 MVC(01)ASP.NET Core MVC 概覽

ASP.NET Core 中文文件 第四章 MVC(01)ASP.NET Core MVC 概覽

ASP.NET Core MVC 是使用模型-檢視-控制器(Model-View-Controller)設計模式構建網頁應用與 API 的豐富的框架。

什麼是 MVC 模式?

模型-檢視-控制器(MVC)架構模式將一個應用區分為三部分主要元件:模型、檢視、與控制器。這種模式有助實現關注分離。使用這種模式,使用者請求被路由到控制器,控制器負責與模型(Model)協作以執行使用者操作和/或返回請求結果。控制器(Controller)選擇檢視(View),展示給使用者,而給檢視提供其所需要的任何模型(Model)。

下面的圖表展示了這三個主要元件以及它們間的相互引用:

這個職責示意圖幫你掌控你的應用的複雜程度,因為其更容易編碼、除錯、與測試一些(模型、檢視、控制器)有單一功能的模組 (進一步瞭解

單一職責原則)。存在兩者或者此三者之間的廣泛依賴是非常難更新、測試、除錯程式碼的。例如,使用者介面邏輯與業務邏輯相比傾向於變化更頻繁。如果表現程式碼與業務邏輯混雜在一個物件內,在你每次改變使用者介面的時候都需要修改一個包含業務邏輯的物件。這也就更容易引入錯誤,並使得你在每次做一個很小的使用者介面改動後都要進行完整的業務邏輯測試。

檢視與控制器都依賴於模型。儘管如此,模型並不依賴於檢視,也不依賴於控制器。這是分離的一大優勢。這樣分離允許不依賴於視覺表現建立並測試模型。

模型(Model)職責

MVC 應用中的模型代表了應用的狀態和業務邏輯或其可以展現的一些操作。業務邏輯應該封裝在模型,連同應用持久化狀態實現邏輯。強型別檢視一般使用特別設計的檢視模型(ViewModel)型別,它包含了檢視顯示需要的資料;控制器將建立並從模型填充這些檢視模型。

有許多種方法組織 MVC 架構形式的應用中的模型。瞭解更多關於 不同型別的模型

檢視(View)職責

檢視負責在使用者介面呈現內容。它們使用 Razor 檢視引擎在 HTML 標記中嵌入 .NET 程式碼。檢視中應僅包含少量的邏輯,而這些邏輯應該是與呈現內容相關的。如果你發現需要在檢視檔案中完成大量的邏輯任務,以便從複雜的模型展示資料,請考慮使用檢視元件檢視模型、或檢視模板來簡化檢視。

控制器(Controller)職責

控制器是承載使用者互動、模型運轉、並最終選擇檢視進行渲染的元件。在 MVC 應用中,檢視只顯示資訊;控制器處理並對使用者輸入和互動做出響應。在 MVC 模式,控制器是最初的入口,負責選擇同哪一個模型型別協作和選擇哪一個檢視用來呈現(就如其名:它控制應用對所給的請求如何做出響應)。

控制器不應該有太多職責而過於複雜。 為避免控制器邏輯過於複雜,請使用單一職責原則將業務邏輯從控制器移到領域模型。

如果你發現你的控制器方法頻繁執行相同型別的方法,你可以依照不要讓自己重複原則將這些通用方法移入過濾器.

什麼是 ASP.NET Core MVC

ASP.NET Core MVC 框架是一個為使用 ASP.NET Core 優化的輕量級、開源、高度可測試的表現框架。

ASP.NET Core MVC 提供了一種基於模式的、使用乾淨的關注分離的方式構建動態網站。它使你能對標籤完全控制,支援友好的測試驅動開發(TDD)開發方式並且使用最新的 Web 標準。

功能特點

ASP.NET Core MVC 包括以下特點:

  • 路由
  • 模型繫結
  • 模型驗證
  • 依賴注入
  • 過濾器
  • 區域
  • 網路應用程式介面
  • 可測試性
  • Razor檢視引擎
  • 強型別檢視
  • 標籤輔助類
  • 檢視元件

路由

ASP.NET Core MVC 是建立在ASP.NET Core 路由上的,一項強大的 URL 對映元件,助你建立擁有可理解的、可搜尋的 URL 的應用。這使得你可以定義你的應用的 URL 命名形式,使得它對搜尋引擎優化(SEO)和連結生成中執行良好,而不用關心你的 WEB 伺服器上的檔案如何組織。你可以使用方便的路由模板語法定義你的路由,路由模板語法支援路由值約束、預設值和可選值。

基於約束的路由 允許你全域性定義你的應用支援的 URL 格式,及這些格式如何各自在給定的控制器中對映到指定的操作(Action)方法。 當接收到傳入請求,路由引擎轉換 URL 且匹配它至一個定義的 URL 格式模板,然後呼叫關聯的控制器的操作方法。

  routes.MapRoute(name: "Default", template: "{controller=Home}/{action=Index}/{id?}");

特性路由(Attribute routing) 允許你以在控制器和方法使用新增特性的方式指定路由資訊來定義你的應用的路由。這意味著你的路由定義緊鄰它們所關聯的控制器和方法。

  [Route("api/[controller]")]
  public class ProductsController : Controller
  {
    [HttpGet("{id}")]
    public IActionResult GetProduct(int id)
    {
      ...
    }
  }

模型(Model)繫結

ASP.NET Core MVC 模型繫結轉換客戶端請求資料(從值、路由資料、請求字元引數、HTTP 標頭)為控制器可以處理的物件。所以,你的控制器邏輯不需要做識別傳入請求資料的工作;使得引數資料傳入到操作方法簡單化。

  public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null) { ... }

模型(Model)驗證

ASP.NET Core MVC 支援 校驗,通過為你的模型物件新增資料批註校驗特性裝飾。校驗特性在客戶端數值傳到伺服器之前被檢查,同時在控制器方法被呼叫之前也會檢查。

  using System.ComponentModel.DataAnnotations;
  public class LoginViewModel
  {
      [Required]
      [EmailAddress]
      public string Email { get; set; }

      [Required]
      [DataType(DataType.Password)]
      public string Password { get; set; }

      [Display(Name = "Remember me?")]
      public bool RememberMe { get; set; }
  }

一個控制器方法:

  public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null)
  {
      if (ModelState.IsValid)
      {
        // work with the model
      }
      // If we got this far, something failed, redisplay form
      return View(model);
  }

框架在客戶端和服務端都將處理請求資料校驗。在模型上指定的驗證邏輯被新增到渲染後的檢視中作為隱藏指令碼,且利用 jQuery Validation在瀏覽器中被強制執行。

依賴注入

ASP.NET Core 內建了對 依賴注入 (DI)的支援。在 ASP.NET Core MVC 中 控制器 能通過它們的建構函式請求所需的服務,允許它們遵循 顯式依賴項原則

你的應用也可以使用 檢視檔案中的依賴注入,使用 @inject 命令:

  @inject SomeService ServiceName
  <!DOCTYPE html>
  <html>
  <head>
    <title>@ServiceName.GetTitle</title>
  </head>
  <body>
    <h1>@ServiceName.GetTitle</h1>
  </body>
  </html>

過濾器(Filters)

過濾器幫助開發者封裝橫切關注點,如異常處理或身份驗證。過濾器允許執行為操作方法自定義的前期的和請求過程中的邏輯,也可以被配置為在給定請求的執行管道的特定時刻執行。過濾器可以作為特性被應用到控制器或方法(也可以全域性執行)。框架包含了幾項過濾器(比如 Authorize )。

    [Authorize]
    public class AccountController : Controller
    {

區域(Areas)

Areas提供了一種將龐大的 ASP.NET Core MVC 網站應用分解的方法。區域是應用中一項有效的MVC結構。在 MVC 專案中,邏輯元件如 Model、控制器及檢視放在不同的資料夾,MVC 使用命名規範來在這些元件間建立關係。對龐大的應用,將應用分解為單獨的高階功能區域是非常有益的。例如,一個電子商務應用擁有多個業務單元,比如結算、賬單、與搜尋等。這些單元中的每一項都有它們各自的邏輯元件檢視、控制器和模型。

網路應用程式介面(Web APIs)

除了是一個強大的建立網站的平臺,ASP.NET Core MVC 對 Web APIs 也具有強有力的支援。你可以建立服務,連線到廣泛的客戶端,包括各種瀏覽器和移動裝置。

框架內建支援格式化資料如 JSON 或 XML ,使其具備了對 HTTP 內容協商的支援。編寫自定義格式以支援你的自有格式。

使用連結生成可以啟用對超媒體的支援。簡單地啟用對跨域資源共享 (CORS)的支援,可使得你的 Web APIs 能在多個應用間共享。

可測試性(Testablility)

框架介面和依賴注入的使用,使其適合進行單元測試,且框架包含的功能(如 TestHost 和 Entity Framework 記憶體提供程式)使得整合測試也是非常快捷和方便的。瞭解更多關於測試控制器邏輯

Razor 檢視引擎

ASP.NET Core MVC 檢視使用Razor 檢視引擎渲染檢視。 Razor 是一種緊湊的、表達能力好且流暢的模板標記語言,用來使用嵌入的 C# 程式碼定義檢視。Razor 被用來在伺服器動態生成 Web 內容。你可以清晰地將服務端程式碼和客戶端程式碼跟內容混合在一起。

  <ul>
    @for (int i = 0; i < 5; i++) {
      <li>List item @i</li>
    }
  </ul>

使用 Razor 檢視引擎你可以定義佈局模板,區域性檢視及可替換的區塊。

強型別檢視

MVC 中的 Razor 檢視可以強型別於你的模型。控制器可以傳遞強型別模型到檢視,使你的檢視支援型別檢查和智慧提示。

例如,下面的檢視定義了 IEnumerable<Product> 型別的模型:

  @model IEnumerable<Product>
  <ul>
      @foreach (Product p in Model)
      {
          <li>@p.Name</li>
      }
  </ul>

標籤輔助類(Tag Helper)

Tag Helpers使得服務端程式碼可以在 Razor 檔案中參與建立和渲染 HTML 元素。你可以使用 tag helper 定義自己的標籤(比如 <environment>)或更改已知標籤的行為(如 <label>)。 Tag Helper 依據元素名稱和屬性繫結到指定元素。它們為服務端渲染帶來便利的同時保留了 HTML 編輯體驗。

有很多內建的 Tag Helper 應對常用任務,比如建立表單、連結、載入資源等,並且在公共的 GitHub 倉庫或作為 NuGet 包,還有更多可用的。Tag Helper 是用 C# 創作的,它們通過元素名、屬性名或父標籤定位 HTML 元素。例如,內建的 LinkTagHelper 可被用來建立一個連結指向到 AccountsControllerLogin 方法:

  <p>
      Thank you for confirming your email.
      Please <a asp-controller="Account" asp-action="Login">Click here to Log in</a>.
  </p>

EnvironmentTagHelper 可以用來在執行時環境包含不同的指令碼到你的檢視(例如:原始的或壓縮的),例如 Development, Staring, 或 Production:

  <environment names="Development">
      <script src="~/lib/jquery/dist/jquery.js"></script>
  </environment>
  <environment names="Staging,Production">
      <script src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-2.1.4.min.js"
              asp-fallback-src="~/lib/jquery/dist/jquery.min.js"
              asp-fallback-test="window.jQuery">
      </script>
  </environment>

Tag Helper 提供友好的 HTML 開發體驗和建立 HTML 與 Razor 標記時的豐富的智慧提示。大多數內建的 Tag Helper 指向存在的 HTML 元素並且為元素提供服務端屬性。

檢視元件

View Components允許你打包渲染邏輯並在應用中重用它。它們與區域性檢視類似,但具有相關的邏輯。

返回目錄

相關推薦

ASP.NET Core 中文 原理2中介軟體

章節: 什麼是中介軟體 中介軟體是用於組成應用程式管道來處理請求和響應的元件。管道內的每一個元件都可以選擇是否將請求交給下一個元件、並在管道中呼叫下一個元件之前和之後執行某些操作。請求委託被用來建立請求管道,請求委託處理每一個 HTTP 請求。 請求委託通過使用 IApplicationBuilder

ASP.NET Core 中文 原理6全球化與本地化

使用 ASP.NET Core 建立一個多語言版本的網站有助於你吸引到更多的使用者,ASP.NET Core 提供服務和中介軟體來支援本地化語言和文化。 國際化涉及 全球化 和 本地化。全球化是為了應用程式支援不同文化而設計的。全球化增加了對特定地理區域的語言文字的輸入、顯示和輸出的支援。 本地化是針對一個

ASP.NET Core 中文 原理11在多個環境中工作

ASP.NET Core 介紹了支援在多個環境中管理應用程式行為的改進,如開發(development),預演(staging)和生產(production)。環境變數用來指示應用程式正在執行的環境,允許應用程式適當地配置。 章節: 開發,預演,生產 ASP.NET Core 引用了一個特定的環境變數

ASP.NET Core 中文 原理4路由

路由是用來把請求對映到路由處理程式。應用程式一啟動就配置了路由,並且可以從URL中提取值用於處理請求。它還負責使用 ASP.NET 應用程式中定義的路由來生成連結。 這份文件涵蓋了初級的ASP.NET核心路由。對於 ASP.NET 核心 MVC 路由, 請檢視 Routing to Controller A

ASP.NET Core 中文 原理13管理應用程式狀態

在 ASP.NET Core 中,有多種途徑可以對應用程式的狀態進行管理,取決於檢索狀態的時機和方式。本文簡要介紹幾種可選的方式,並著重介紹為 ASP.NET Core 應用程式安裝並配置會話狀態支援。 應用程式狀態的可選方式 應用程式狀態 指的是用於描述應用程式當前狀況的任意資料。包括全域性的和使用者特

ASP.NET Core 中文 原理1應用程式啟動

ASP.NET Core 為你的應用程式提供了處理每個請求的完整控制。Startup 類是應用程式的入口(entry point),這個類可以設定配置(configuration)並且將應用程式將要使用的服務連線起來。開發人員可以在 Startup 類中配置請求管道,該管道將用於處理應用程式的所有請求。 章

ASP.NET Core 中文 原理16.NET開放Web介面OWIN

ASP.NET Core 支援 OWIN(即 Open Web Server Interface for .NET 的首字母縮寫),OWIN的目標是用於解耦Web Server和Web Application。此外, OWIN為中介軟體定義了一個標準方法用來處理單個請求以及相關聯的響應。ASP.NET Co

ASP.NET Core 中文 原理17為你的伺服器選擇合適版本的.NET框架

ASP.NET Core基於 .NET Core 專案模型,它支援構建能夠執行在 Windows、Mac和 Linux 上的跨平臺應用程式。當您構建一個 .Net Core 專案的時候,您可以選擇一種 .NET框架來構建您的應用程式,.NET Framework (CLR)、 .NET Core (Core

ASP.NET Core 中文 MVC4.6Areas區域

Areas 是 ASP.NET MVC 用來將相關功能組織成一組單獨名稱空間(路由)和資料夾結構(檢視)的功能。使用 Areas 建立層次結構的路由,是通過新增另一個路由引數 area 到 Controller 和 action。 Areas 提供了一種把大型 ASP.NET Core MVC Web 應用

ASP.NET Core 中文 MVC4.2控制器操作的路由

ASP.NET Core MVC 使用路由 中介軟體 來匹配傳入請求的 URL 並對映到具體的操作。路由通過啟動程式碼或者特性定義。路由描述 URL 路徑應該如何匹配到操作。路由也同樣用於生成響應中返回的 URL(用於連結)。 這篇文章將解釋 MVC 和路由之間的相互作用,以及典型的 MVC 應用程式如何使

ASP.NET Core 中文 MVC4.1Controllers, Actions 和 Action Results

Action 和 action result 是開發者使用 ASP.NET MVC 構建應用程式的基礎部分。 什麼是 Controller 在 ASP.NET MVC 中, 控制器( Controller  )用於定義和聚合操作(Action)的一個集合。操作( 或操作方法 )是控制器中處理入站請求的一個方

ASP.NET Core 中文 MVC2.3格式化響應資料

ASP.NET Core MVC 內建支援對相應資料(response data)的格式化,用來修正格式或生成客戶端指定的格式。 特定格式的操作結果 某些操作結果(Action result)的型別是指定的特定格式,比如 JsonResult 或 ContentResult。Action 可以返回格式化為

ASP.NET Core 中文 MVC4.4依賴注入和控制器

ASP.NET Core MVC 控制器應通過它們的構造器明確的請求它們的依賴關係。在某些情況下,單個控制器的操作可能需要一個服務,在控制器級別上的請求可能沒有意義。在這種情況下,你也可以選擇將服務作為 action 方法的引數。 章節: 依賴注入 依賴注入(Dependency injection,

ASP.NET Core 中文 MVC01ASP.NET Core MVC 概覽

ASP.NET Core MVC 是使用模型-檢視-控制器(Model-View-Controller)設計模式構建網頁應用與 API 的豐富的框架。 什麼是 MVC 模式? 模型-檢視-控制器(MVC)架構模式將一個應用區分為三部分主要元件:模型、檢視、與控制器。這種模式有助實現關注分離。使用這種模式,使

ASP.NET Core 中文 MVC4.3過濾器

ASP.NET MVC 過濾器 可在執行管道的前後特定階段執行程式碼。過濾器可以配置為全域性有效、僅對控制器有效或是僅對 Action 有效。 過濾器如何工作? 不同的過濾器型別會在執行管道的不同階段執行,因此它們各自有一套適用場景。根據你實際要解決的問題以及在請求管道中執行的位置來選擇建立不同的過濾器。

ASP.NET Core 中文 MVC3.8檢視中的依賴注入

ASP.NET Core 支援在檢視中使用 依賴注入 。這將有助於提供檢視專用的服務,比如本地化或者僅用於填充檢視元素的資料。你應該儘量保持控制器和檢視間的關注點分離(separation of concerns)。你的檢視所顯示的大部分資料應該從控制器傳入。 章節: 一個簡單的示例 你可以使用 @i

ASP.NET Core 中文 MVC3.7 區域性檢視partial

ASP.NET Core MVC 支援區域性檢視,當你需要在多個不同檢視間重用同一個頁面部件時會顯得特別有用。 什麼是區域性檢視? 區域性檢視是在其它檢視中被渲染的檢視。區域性檢視執行後生成的 HTML 結果會被渲染到呼叫方檢視或父檢視中。跟檢視檔案一樣,區域性檢視檔案也使用 .cshtml 作為副檔名。

ASP.NET Core 中文 MVC4.5測試控制器邏輯

ASP.NET MVC 應用程式的控制器應當小巧並專注於使用者介面。涉及了非 UI 事務的大控制器更難於測試和維護。 章節: 為什麼要測試控制器 控制器是所有 ASP.NET Core MVC 應用程式的核心部分。因此,你應當確保它們的行為符合應用的預期。 自動化測試可以為你提供這樣的保障並能夠在進入生

ASP.NET Core 中文 MVC3.9檢視元件

章節: 介紹檢視元件 檢視元件是 ASP.NET Core MVC 中的新特性,與區域性檢視相似,但是它們更加的強大。檢視元件不使用模型繫結,只取決於呼叫它時所提供的資料。檢視元件有以下特點: 渲染一個塊,而不是整個響應 在控制器和檢視之間同樣包含了關注點分離和可測試性帶來的好處 可以擁有引數和業務邏

ASP.NET Core 中文 測試5.2整合測試

整合測試確保應用程式的元件組裝在一起時正常工作。 ASP.NET Core支援使用單元測試框架和可用於處理沒有網路開銷請求的內建測試的網路主機整合測試。 章節: 整合測試介紹 整合測試驗證應用程式不同的部位是否正確地組裝在一起。不像單元測試,整合測試經常涉及到應用基礎設施,如資料庫,檔案系統,網路資源