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.
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ư.
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:
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 Add → New Item.
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.