原文:ASP.NET Core 動做結果 - ASP.NET Core 基礎教程 - 簡單教程,簡單編程html
前面的章節中,咱們一直使用簡單的 C#
類做爲控制器。 雖然這些類不是從基類派生的,但仍然能夠在 MVC 中使用這種方法。 固然了,對於控制器,但更常見的作法是從 Microsoft.AspNetCore.Mvc
命名空間中提供的控制器基類中派生控制器。本章中,咱們將嘗試這麼作,而且學習動做結果 ( Action Results )。編程
Microsoft.AspNetCore.Mvc
命名空間下的基類 Controller
讓咱們可以訪問不少關於 HTTP 請求的上下文信息,以及提供了一些方法幫助我們構建返回給回客戶端的結果json
返回的響應的結果中,咱們能夠發送簡單的字符串或者整數,或者發送像對象這樣的複雜數據來表示學生或大學或餐館等信息,以及與該對象關聯的全部數據markdown
這些結果一般被封裝到實現 IActionResult
接口的對象中,有大量的不一樣類型的結果實現了該接口,這些結果類型能夠包含模型或文件的內容以供下載框架
這些不一樣的結果類型便可以返回 JSON,也能夠返回 XML,或者 HTML 視圖less
動做基本上能夠返回任意不一樣類型的動做結果。它們都有一個共同的基類:ActionResult
ide
下表列出了不一樣種類的動做結果及其行爲學習
動做名稱( 類 ) | 行爲 |
---|---|
ContentResult | 返回一串字符串 |
FileContentResult | 返回文件的內容 |
FilePathResult | 返回路徑文件的內容 |
FileStreamResult | 返回流文件的內容 |
EmptyResult | 返回空 |
JavaScriptResult | 返回一段 JavaScript 代碼 |
JsonResult | 返回 JSON 格式的數據 |
RedirectToResult | 重定向到某個 URL |
HttpUnauthorizedResult | 返回 403 未受權狀態碼 |
RedirectToRouteResult | 重定向到不一樣的控制器或方法 |
ViewResult | 從視圖引擎中返回一個響應 |
PartialViewResult | 從視圖引擎中返回一個響應 |
如今,咱們修改 HomeController.cs
,引入命名空間 Microsoft.AspNetCore.Mvc
,並修改 HomeController
繼承自 Controller
。spa
下面代碼是 HomeController
類的完整實現code
using System; using Microsoft.AspNetCore.Mvc; namespace HelloWorld.Controllers { public class HomeController: Controller { public ContentResult Index() { return Content("你好,世界! 這條消息來自使用了 Action Result 的 Home 控制器"); } } }
咱們能夠看到,Index()
方法返回了一個 ContentResult
類型的結果。ContentResult
是實現了 ActionResult
接口的不一樣結果類型之一
在 Index()
方法中,咱們將一個字符串傳遞給 Content()
。 Content()
方法會產生一個 ContentResult
,也就是說,Index()
方法會返回 ContentResult
保存 HomeController.cs
文件,重啓應用程序,而後訪問跟目錄 /
,咱們將會獲得如下輸出
咱們能夠看到,這個響應和以前咱們看到的響應幾乎沒有任何區別,它仍然只是一個純文本的響應
你可能很想知道使用 ActionResult 來生成東西有什麼優點
在 Mvc 模式中,控制器決定接下來要作什麼,返回一個字符串或 HTML 或返回可能被序列化爲 JSON 等的模型對象
Mvc 中的控制器須要作的就是作出決定,但控制器沒必要直接在響應中寫入決策結果。 它只須要返回結果,而後框架會使用這些結果並理解如何將結果轉換爲可經過 HTTP 發回的內容
若是你不能理解上面這些內容,不要緊,咱們再來看一個範例,此次咱們使用 ObjectResult
在解決方案管理器中的 HelloWorld
上點擊右鍵,建立一個新文件夾並將其命名爲 Models
。 在 Models
文件夾中,添加一個用於表示僱員的 Employee
類
建立完成後,目錄結構以下
Employee.cs
中的內容以下
using System; namespace HelloWorld.Models { public class Employee { public Employee() { } } }
修改剛剛建立的 Employee
類,添加兩個屬性,一個整型的 ID
和 一個字符串類型的 Name
,修改完成後 Employee.cs
中的內容以下
using System; namespace HelloWorld.Models { public class Employee { public Employee() { } public int ID { get; set; } public string Name { get; set; } } }
而後咱們回到 HomeController
控制器,修改 Index()
方法,返回一個 Employee
對象。
修改完成後的 HomeController.cs
內容以下
using System; using Microsoft.AspNetCore.Mvc; using HelloWorld.Models; namespace HelloWorld.Controllers { public class HomeController: Controller { public ObjectResult Index() { var employee = new Employee { ID = 1, Name = "語飛"}; return new ObjectResult(employee); } } }
如今,返回的不是 Content,而是返回一個不一樣類型的結果 ObjectResult
。 若是咱們想要一個 ObjectResult,咱們須要建立或實例化一個 ObjectResult 並將一些模型對象做爲參數傳遞給它
在 MVC 框架中,ObjectResult 是特殊的,由於當咱們返回一個 ObjectResult 時,MVC 框架將訪問這個對象。並將這個對象作一些轉換,而後做爲 HTTP 響應返回給客戶端
在轉換 ObjectResult 對象時,它可能被序列化爲 XML 或 JSON 或其它格式, 至於什麼格式,由應用程序啓動時向 MVC 提供的配置信息決定。若是咱們沒有顯式的配置任何東西,那麼將會使用 JSON 做爲默認格式
保存全部的文件,重啓應用程序,而後訪問首頁,咱們將獲得以下結果