原文:Controllers, Actions, and Action Results
作者:Steve Smith
翻譯:姚阿勇(Dr.Yao)
校對:許登洋(Seay)
Action 和 action result 是開發者使用 ASP.NET MVC 構建應用程序的基礎部分。
什么是 Controller
在 ASP.NET MVC 中, 控制器( Controller
)用於定義和聚合操作(Action)的一個集合。操作( 或操作方法 )是控制器中處理入站請求的一個方法。控制器提供了一種邏輯方式將相似的操作組織起來,允許一些通用的規則(如:路由,緩存和驗證)得到共同的應用。 入站請求通過路由(routing)被映射到操作上。
在 ASP.NET Core MVC 中,控制器可以是任何以 “Controller” 結尾或者繼承自以 “Controller” 結尾的可實例化類。控制器應當遵循 顯式依賴原則 並且通過使用依賴注入在構造函數中獲取他們需要的任何依賴項。
按照慣例,控制器類:
- 放在根目錄下的 “Controllers” 文件夾中
- 繼承自 Microsoft.AspNetCore.Mvc.Controller
這兩個慣例不是強制要求。
在模型-視圖-控制器模式中,控制器負責初始化請求以及實例化模型。通常來說,業務流程應當放在模型中執行。
說明
模型應該是一個簡單的傳統 CLR 對象(Plain Old CLR Object (POCO) ),而不是一個數據庫上下文DbContext
或者關系數據庫類型。
控制器取得模型的執行結果(如果有),返回正確的視圖以及相關的視圖數據。更多請參考:Overview of ASP.NET Core MVC 和 ASP.NET Core MVC 和 Visual Studio 入門。
技巧
控制器是一個 UI級別 的抽象。它的責任在於確保入站請求的數據是有效的,然后選擇應當返回哪一個視圖(或者 API 的結果)。在有着良好分解的應用程序中,控制器不會直接包含數據訪問或業務邏輯,而是委托給服務去處理這些任務。
Action 的定義
控制器上的任意公共方法都是一個 Action 。Action 上的參數是通過 模型綁定 來請求數據綁定並校驗。
提示
帶有參數的 Action 方法應該檢查ModelState.IsValid
屬性的值是否為真 。
Action 方法應當包含將傳入請求映射到業務的邏輯。業務關注通常應該表現為由控制器通過( 依賴注入(dependency injection))訪問服務。Actions 然后映射業務行為的結果到應用程序的狀態。
Action 可以返回任何東西,但是常常會返回一個 IActionResult
(或異步方法返回的 Task<IActionResult>
)實例生成響應。Action 方法負責選擇“響應的類型”,Action Result 負責“響應的執行”。
控制器輔助方法
- 視圖(View)
返回一個使用模型渲染 HTML 的視圖。例:return View(customer);
- HTTP 狀態代碼
返回一個 HTTP 狀態代碼。例:return BadRequest();
- 格式化的響應
返回Json
或類似以特定方式格式化的對象。例:return Json(customer);
- 內容協商的響應
除了直接返回一個對象,Action 還可以返回一個內容協商的響應(使用Ok
,Created
,CreatedAtRoute
或CreatedAtAction
)。例如:return Ok();
或return CreatedAtRoute("routename",values,newobject");
- 重定向
返回一個指向其他 Action 或目標的重定向(使用Redirect
,LocalRedirect
,RedirectToAction
或RedirectToRoute
)。例如:return RedirectToAction("Complete", new {id = 123});
除了上面的方法之外,Action 還可以直接返回一個對象。在這種情況下,對象將以客戶端要求的方式進行格式化。詳情請參考: 格式化響應數據
橫切關注點
在大多數應用中,許多 Action 會共用部分工作流。例如,大多數應用可能只對驗證過的用戶開放,或者要利用緩存。當你想要在 Action 方法運行之前或之后執行一些邏輯業務時,可以使用 過濾器(filter) 。利用 過濾器(filters) 處理一些橫切關注點,可以防止你的 Action 變得過於臃腫。這有助於剔除 Action 中的重復代碼,使得它們可以遵循 不要重復你自己(DRY)原則 。
就驗證和授權而言,你可以將 Authorize
特性應用在任何一個要求授權的 Action 上。將它加在控制器上將會對該控制器里的所有的 Action 采用授權。這個特性的添加將確保每個訪問此 Action 的請求都被應用了對應的過濾器。有些特性可以同時應用在控制器和 Action 上,以提供對過濾器行為更小粒度的控制。
關於 MVC 應用程序中橫切關注點的其他例子:
提示
在 MVC 應用程序里,很多橫切關注點都可以利用過濾器來處理。還有另一種對所有 ASP.NET Core 應用程序都有效的選擇需要記住,就是自定義 中間件(middleware)。