ASP.NET Core - 操作結果



在本章中,我們將討論操作結果。在前面的章節中,我們一直在使用簡單的 C# 類作為控制器。這些類沒有從基類派生,你可以在 MVC 中使用這種方法,但更常見的是從 Microsoft.AspNet.Mvc 名稱空間中提供的控制器基類派生控制器。

  • 此基類使我們能夠訪問有關請求的大量上下文資訊,以及幫助我們構建結果以傳送回客戶端的方法。

  • 你可以在響應中傳送回簡單的字串和整數。你還可以傳送回覆雜的物件,例如表示學生、大學或餐廳等的物件,以及與該物件關聯的所有資料。

  • 這些結果通常封裝在實現 IActionResult 介面的物件中。

  • 有許多不同的結果型別實現了此介面——可以包含模型或要下載的檔案內容的結果型別。

  • 這些不同的結果型別允許我們向客戶端傳送回 JSON 或 XML 或構建 HTML 的檢視。

操作基本上返回不同型別的操作結果。ActionResult 類是所有操作結果的基類。以下是不同型別的操作結果及其行為的列表。

名稱 行為
ContentResult 返回字串
FileContentResult 返回檔案內容
FilePathResult 返回檔案內容
FileStreamResult 返回檔案內容。
EmptyResult 不返回任何內容
JavaScriptResult 返回要執行的指令碼
JsonResult 返回 JSON 格式的資料
RedirectToResult 重定向到指定的 URL
HttpUnauthorizedResult 返回 403 HTTP 狀態程式碼
RedirectToRouteResult 重定向到不同的操作/不同的控制器操作
ViewResult 作為檢視引擎的響應接收
PartialViewResult 作為檢視引擎的響應接收

示例 1

讓我們透過開啟 **HomeController** 類並從基於控制器的類派生它來執行一個簡單的示例。此基類位於 **Microsoft.AspNet.Mvc** 名稱空間中。以下是 **HomeController** 類的實現。

using Microsoft.AspNet.Mvc; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Threading.Tasks;  

namespace FirstAppdemo.Controllers  { 
   public class HomeController : Controller { 
      public ContentResult Index() { 
         return Content("Hello, World! this message is from 
            Home Controller using the Action Result"); 
      } 
   } 
}

現在你可以看到 index 方法返回 ContentResult,它是結果型別之一,並且所有這些結果型別最終都實現了 **ActionResult** 介面。

在 Index 方法中,我們將一個字串傳遞給 Content 方法。此 Content 方法生成一個 ContentResult;這意味著 Index 方法現在將返回 **ContentResult**。

讓我們儲存 **HomeController** 類並在瀏覽器中執行應用程式。它將生成以下頁面。

Action Result

現在你可以看到一個響應,它與我們之前看到的響應沒有什麼不同。它仍然只是一個純文字響應。

  • 你可能想知道使用生成 **ActionResult** 的東西有什麼好處。

  • 典型的優點是它只是封裝控制器決策的一種正式方式。

  • 控制器決定接下來做什麼,要麼返回字串或 HTML,要麼返回可能被序列化為 JSON 等的模型物件。

  • 控制器需要做的只是做出決定,並且控制器不必直接寫入響應其決策的結果。

  • 它只需要返回決策,然後是框架將獲取結果並理解如何將該結果轉換為可以透過 HTTP 傳送回的內容。

示例 2

讓我們再舉一個例子。在專案中建立一個新資料夾並將其命名為 **Models**。在 Models 資料夾中,我們想要新增一個可以表示 Employee 的類。

Models

在“名稱”欄位中輸入 **Employee.cs**,如上圖所示。此處,Employee 類的實現包含兩個屬性。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Threading.Tasks;  

namespace FirstAppDemo.Models { 
   public class Employee { 
      public int ID { get; set; } 
      public string Name { get; set} 
   } 
}

在 **HomeController** 的 Index 操作方法中,我們想要返回一個 Employee 物件。以下是 HomeController 的實現。

using FirstAppDemo.Models; 
using Microsoft.AspNet.Mvc; 

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Threading.Tasks;  

namespace FirstAppdemo.Controllers { 
   public class HomeController : Controller { 
      public ObjectResult Index() { 
         var employee = new Employee { ID = 1, Name = "Mark Upston"}; 
         return new ObjectResult(employee); 
      } 
   } 
} 

現在,我們不再返回 Content,而是返回一種稱為 **ObjectResult** 的不同型別的結果。如果我們想要 ObjectResult,我們需要建立一個或例項化一個 ObjectResult 並向其中傳遞一些 **model** 物件。

  • ObjectResult 在 MVC 框架中是特殊的,因為當我們返回 ObjectResult 時,MVC 框架會檢視此物件。此物件需要在 HTTP 響應中表示。

  • 此物件應序列化為 XML 或 JSON 或其他某種格式,最終,決策將基於你在啟動時提供給 MVC 的配置資訊做出。如果你沒有配置任何內容,你只會獲得一些預設值,預設值是 JSON 響應。

儲存所有檔案並重新整理瀏覽器。你將看到以下輸出。

Mark Upston
廣告

© . All rights reserved.