ActionResult trong ASP.NET Core

Trong hướng dẫn này, chúng ta sẽ thảo luận về ActionResult trong ASP.NET Core. Trong các hướng dẫn trước, chúng ta đã sử dụng các lớp C# đơn giản làm controller.

Các lớp này không kế thừa từ một lớp cơ sở và bạn có thể sử dụng cách tiếp cận này với MVC, nhưng một cách phổ biến và hiệu quả hơn đó là kế thừa từ lớp Controller cơ sở được cung cấp trong namespace Microsoft.AspNet.Mvc.

  • Lớp Controller cơ sở này cho phép chúng ta truy cập vào nhiều thông tin theo ngữ cảnh về một yêu cầu, cũng như các phương thức giúp chúng ta xây dựng kết quả để trả về cho khách hàng.
  • Bạn có thể trả về các chuỗi và số nguyên đơn giản trong một phản hồi. Bạn cũng có thể trả về các đối tượng phức tạp như một sinh viên hoặc trường đại học hoặc nhà hàng, v.v. và tất cả dữ liệu liên quan đến đối tượng đó.
  • Các kết quả này thường được gói gọn trong một đối tượng thực hiện interface IActionResult.
  • Có nhiều loại kết quả trả về khác nhau thực hiện interface này - loại kết quả có thể chứa model hoặc nội dung của file để tải xuống.
  • Các loại kết quả khác nhau này có thể cho phép chúng ta trả về cho khách hàng kiểu JSON hoặc XML hoặc view để tạo trang HTML.

Các kiểu action results trong ASP.NET Core

Phương thức hành động (action method) về cơ bản trả về các kiểu ActionResult khác nhau. Lớp ActionResult là lớp cơ sở cho tất cả các kiểu ActionResult. Sau đây là danh sách các kiểu ActionResult.

Tên Miêu tả
ContentResult Trả về một chuỗi
FileContentResult Trả về nội dung file
FilePathResult Trả về nội dung file
FileStreamResult Trả về nội dung file.
EmptyResult Trả về rỗng
JavaScriptResult Trả về tập lệnh để thực thi
JsonResult Trả về dữ liệu được định dạng JSON
RedirectToResult Chuyển hướng đến URL được chỉ định
HttpUnauthorizedResult Trả về mã trạng thái 403 HTTP
RedirectToRouteResult Chuyển hướng đến hành động khác nhau / hành động điều khiển khác nhau
ViewResult Nhận được như một phản hồi cho view engine
PartialViewResult Nhận được như một phản hồi cho view engine

Sử dụng ActionResult trong ASP.NET Core

Ví dụ 1 - Sử dụng ContentResult

Chúng ta hãy thực hiện một ví dụ đơn giản bằng cách mở lớp HomeController và cho nó kế thừa từ lớp Controller. Lớp Controller nằm trong namespace Microsoft.AspNet.Mvc. Sau đây là mã của lớp HomeController sau khi chỉnh sửa.

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"); 
      } 
   } 
}

Bây giờ bạn có thể thấy rằng phương thức Index trả về ContentResult, một trong những kiểu ActionResult và tất cả các kiểu ActionResult đều kế thừa từ lớp ActionResult.

Trong phương thức Index, chúng ta đã chuyển một chuỗi vào phương thức Content. Phương thức Content này trả về một thể hiện của lớp ContentResult điều này có nghĩa là phương thức Index sẽ trả về ContentResult.

Chúng ta lưu lớp HomeController và chạy ứng dụng trong trình duyệt. Nó sẽ tạo ra kết quả như hình sau.

ContentResult trong ASP.NET Core

Bây giờ bạn có thể thấy ứng dụng trả về văn bản đơn giản không khác bất kỳ phản hồi nào chúng ta đã thấy trước đây. Bạn có thể tự hỏi lợi thế của việc sử dụng ActionResult là gì.

  • Ưu điểm của ActionResult: nó là cách chính thức để đưa ra các phản hồi của controller.
  • Controller chỉ quan tâm đến vấn đề đưa ra phản hồi, nó không quan tâm dữ liệu trả về sẽ có dạng một chuỗi hoặc HTML hoặc trả về một đối tượng model có thể được serialize thành JSON, v.v.
  • Controller chỉ cần trả về phản hồi và sau đó chính framework sẽ định dạng lại dữ liệu trả về rồi gửi lại qua HTTP.

Ví dụ 2 - Sử dụng ObjectResult

Hãy để chúng tôi lấy một ví dụ khác. Tạo một thư mục mới trong dự án và gọi nó là Models. Trong thư mục Models, chúng tôi muốn thêm một lớp có thể đại diện cho Employee.

Nhập Employee.cs vào trường Name như trong ảnh chụp màn hình ở trên. Lớp Employee rất đơn giản chỉ chứa hai thuộc tính.

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} 
   } 
}

Bên trong phương thức hành động Index của HomeController, chúng tôi muốn trả về một đối tượng Employee. Sau đây là mã của HomeController sau khi đã cập nhật.

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); 
      } 
   } 
} 

Bây giờ, thay vì trả về ContentResult, chúng tôi sẽ trả về một loại kết quả khác được gọi là ObjectResult. Nếu chúng ta muốn có một ObjectResult, chúng ta cần khởi tạo một ObjectResult và truyền vào cho nó một đối tượng model.

  • ObjectResult là một lớp đặc biệt trong ASP.NET Core vì khi chúng ta trả về ObjectResult, hệ thống sẽ định dạng dữ liệu trước khi gửi phản hồi HTTP.
  • Đối tượng này phải được serialize thành XML hoặc JSON hoặc một định dạng khác phụ thuộc vào cấu hình mà bạn cung cấp cho ASP.NET Core ngay khi khởi động hệ thống. Nếu bạn không cấu hình bất cứ điều gì, hệ thống sẽ trả về JSON.

Lưu tất cả các file của bạn và nhấn F5 để chạy ứng dụng trên trình duyệt. Bạn sẽ thấy kết quả như.

ObjectResult trong ASP.NET Core

Ví dụ 3 - Sử dụng ViewResult

Bây giờ chúng ta sẽ cập nhật lại phương thức hành động Index của HomeController như sau.

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 ViewResult Index() 
      { 
         var employee = new Employee 
         { 
             ID = 1,
             Name = "Mark Upston"
         };
         
         return View(employee); 
      } 
   } 
}

Bên trong HomeController, thay vì trả về ObjectResult, chúng ta trả về phương thức View(employee). Phương thức View trả về đối tượng kiểu ViewResult, vì vậy chúng ta cũng sẽ thay đổi kiểu trả về của phương thức Index thành ViewResult. Đây là kết quả khi chạy chương trình:

ViewResult trong ASP.NET Core

Như bạn thấy ở trên, ứng dụng hiện một thông báo lỗi. Lỗi này là do ASP.NET Core không tìm thấy view Index.cshtml ở trong thư mục /View/Home hoặc /View/Shared.

  • View theo mặc định trong dự án ASP.NET Core là các file có phần mở rộng là *.cshtml và phải tuân theo một quy ước cụ thể. Theo mặc định, tất cả view phải đặt trong thư mục Views trong dự án.
  • Vị trí của view và tên view sẽ được ASP.NET Core tự động lấy theo tên controller và tên của phương thức hành động nếu bạn không cung cấp cho nó bất kỳ thông tin bổ sung nào.
  • Nếu chúng ta cần hiển thị view từ phương thức hành động Index của HomeController, vị trí đầu tiên mà ASP.NET Core sẽ tìm view Index.cshtml trong thư mục /Views/Home.
  • Nếu không tìm thấy, nó sẽ tiếp tục tìm trong thư mục /View/Shared. Nếu bạn đặt view trong thư mục /Views/Shared thì bạn có thể sử dụng chúng ở bất cứ đâu trong ứng dụng.

Bây giờ chúng ta hãy tạo file Index.cshtml ở thư mục /Views/Home. Đầu tiên chúng ta sẽ tạo thư mục Home trong thư mục Views, tất cả các view của HomeController sẽ đặt trong thư mục này. Nếu bạn có controller khác tên là BookController thì bạn sẽ tạo thư mục tên Book trong thư mục Views, thật đơn giản phải không nào. Bạn nhấp chuột phải vào thư mục Home và chọn AddNew Item.

Tạo MVC View Page

Bạn chọn MVC View Page và nhập index.cshtml vào trường Name và nhấp vào nút Add.

Chúng tôi thêm đoạn mã sau vào file Index.cshtml.

<html xmlns = "http://www.w3.org/1999/xhtml"> 
   <head> 
      <title>Home</title> 
   </head> 
   
   <body> 
      <h1>Welcome!</h1> 
      
      <div> 
         @Model.Name 
      </div> 
   </body> 
</html> 

Khi chúng tôi sử dụng dấu @ trong Razor, thì Razor view engine sẽ xử lý bất cứ điều gì bạn nhập như một biểu thức C#. Razor view có một số thành viên tích hợp mà chúng ta có thể sử dụng để truy cập vào các biểu thức C#. Một trong những thành viên quan trọng nhất là Model. Khi bạn sử dụng @Model có nghĩa là bạn sẽ nhận được đối tượng model mà bạn đã truyền vào view từ controller (chính là đoạn return view(employee); - bạn đã truyền đối tượng employee cho view). Vì vậy @Model.Name sẽ hiển thị tên của nhân viên.

Bây giờ chúng ta chạy chương trình và sẽ thấy kết quả như sau.

ViewResult trong ASP.NET Core


Bài viết liên quan:

View Layout, View Start, View Imports là gì? Lợi ích và các sử dụng View Layout, View Start, View Imports trong ASP.NET Core.

Tất tần tật về View, Razor View, Layout View, View Start, View Import, Tag Helpers trong ASP.NET Core MVC.

Routing trong ASP.NET Core là gì? Làm sao để cấu hình định tuyến trong ASP.NET Core.