Bài viết này chúng ta sẽ tìm hiểu làm sao để định dạng một response trả về trong Action method. ASP.NET Core cung cấp một tập các API gọi là Action Result để tạo ra các định dạng response cho từng nhu cầu. Hãy cùng tìm hiểu về Action Result là gì vầ sự khác nhau giữa các loại Action Result có sẵn nhé. Show
Action Result là gì?Controller Action sẽ trả về kết quả cho client. Client có thể mong muốn một kết quả đơn giản như là chuỗi hay số nguyên hoặc một kết quả phức tạp như là JSON hay HTML view hoặc file để download. Controller trong ASP.NET Core chỉ đơn giản là các class C#. Nó không cần phải kế thừa từ bất cứ base class nào.Nhưng ASP.NET Core cung cấp một class Controller nó kế thừa từ một ControllerBase class. Điều này giúp class cung cấp rất nhiều các method hữu ích, nó giúp Controller làm việc dễ dàng hơn. Vì thế thông thường các controller của chúng ta đều kế thừa từ Controller class. Controller Base class triển khai các loại Action Result khác nhau sẵn có giúp xây dựng các loại kết quả trả về khác nhau cho client. Ví dụ, ViewResult trả về một HTML response. Một RedirectResult chuyển hướng đến URL khác. Content Result trả về một chuỗi văn bản. Các kiểu trả về này được biết đến là Action Result. IActionResult và ActionResultIActionResult là một interface nó định nghĩa một khuôn mẫu cho toàn bộ các Action Result của một action method. ActionResult là một abstract base class triển khai interface IActionResult. Action result như ViewResult, PartialViewResult hay JsonResult...đều kế thừa từ ActionResult base class. Tại sao lại dùng Action Result?Không cần phải sử dụng Action Result trong ASP.NET Core. Các Controller không cần phải kế thừa từ Controller class. Bạn có thể thao tác trự tiếp với đối tượng HTTP Response trong Controller và quyết định xem trả về gì? Ví dụ dưới đây mô tả cách inject đối tượng HttpContext vào Constructor của Controller và sau đó sử dụng nó để tạo ra Response:
Mặc dù cách tiếp cận này vẫn làm việc bình thường nhưng nó không phải là cách tốt nhất để tạo ra Response từ Controller. Xử lý tất cả các controller như thế này sẽ nhàm chán, dễ sinh lỗi và khó bảo trì. Action Result đóng gói tất cả các chi tiết vào trong nó. Nó có nhiều các tính năng hữu dụng giúp dễ dàng hơn trong việc tạo response. Tạo ra Response trực tiếp từ Controller class như ví dụ trên. Nó sẽ làm khó cho Unit Test. Unit Test một Controller class sẽ cần phải mock các triển khai của Response object. Để test kế quả chúng ta lại cần chuyển nó sang HTML Response. Action Result sẽ có tất cả những gì cần thiết để chạy Controller và Action method. Đối tượng context sẽ dễ dàng được giả lập thông qua base class của nó. Bạn không cần phải chuyển bất cứ kết quả sang HTML để kiểm trả kết quả của một action method. Bạn có thể kiểm tra ngay đối tượng ActionResult để đảm bảo rằng bạn nhận kết quả như mng muốn. Làm sao để sử dụng Action Result?Như đã nhắc đến ở trên, ActionResult là một abstract class base mà triển khai IActionResult. Nó được định nghĩa trong namespace: Microsoft.AspNetCore.Mvc. ContentResult là một trong số các Action Result trả về một chuỗi văn bản:
Phương thức Index trả về một ContentResult. Đầu tiên chúng ta khởi tạo đối tượng của ContentResult sau đó gán giá trị "Hello World" cho thuộc tính Content của nó và trả về. Chúng ta có một Helper method của Controller base class đó là View nó cũng làm việc tương tự nhưng code ngắn hơn nhiều:
Phương thức Content cũng gọi ContentResult ngầm định. Hầu hết các Action Result đều có helper method được định nghĩa trong Controller base class. Thường thì các phương thức này có từ "Result". Ví dụ: Content cho ContentResult, View cho ViewResult. Kiểu trả vềPhương thức Index ở trên trả về một ContentResult. Cách ưa chuộng hơn là sử dụng ActionResult như là một kiểu trả về:
Trả về ActionResult thay vì kiểu thực tế giúp chúng ta sử dụng bất cứ Action Result nào:
Phương thức Index trả về 2 kiểu Action Result là NotFoundResult và ContentResult phụ thuộc giá trị của tham số id. Các loại Action ResultCó nhiều loại Action Result có sẵn trong Microsoft.AspNetCore.Mvc namespace. Nó được phân loại theo công năng sử dụng:
Trả về HTMLCó 2 Action result trả về HTML Response. ViewResult và PartialViewResult. ViewResultPhương thức View() tìm kiếm View trong thư mục Views/<Controller> để tìm file .cshtml và chuyển nó cho Razor View Engine. Bạn có thể gán cho nó model dữ liệu. View sẽ trả về một ViewResult và kết quả là một HTML Response. Mở HomeController và copy đoạn code sau:
Phương thức Index gọi View() sẽ trả về một ViewResult. PartialViewResultPartialView Result sử dụng model để tạo ra một phần của View. Chúng ta sử dụng ViewResult để tạo ra một view hoàn chỉnh còn PartialView trả về một phần của View. Kiểu trả về này hữu ích với Single Page Application (SPA) ki bạn muốn cập nhật một phần của View thông qua AJAX.
Chuyển hướng người dùngRedriect result được dùng khi bạn muốn chuyển hướng người dùng đến một URL khác. Có 4 loại redirect result có sẵn. RedirectResult, LocalRedirectResult, RedirectToActionResult và RedirectToRouteResult. Mỗi một redirect này có thể trả về bất cứ mã trạng thái (status code) dưới đây:
RedirectResultRedirectResult sẽ trả về cho user bằng cách cung cấp đường dẫn tuyệt đối hoặc tương đối: ACTION RESULT CONTROLLER METHOD STATUS CODE RedirectResult Redirect 302 Found (Temporarily moved) RedirectPermanent 301 Moved Permanently RedirectPermanentPreserveMethod 308 Permanent Redirect RedirectPreserveMethod 307 Temporary Redirect Ví dụ:
Thay vào đó, bạn có thể sử dụng RedirectResult trực tiếp được định nghĩa trong Microsoft.AspNetCore.Mvc. Cú pháp là: RedirectResult(string url, bool permanent, bool preserveMethod)
LocalRedirectResultAction result này tương tự như RedirectResult nhưng chỉ khác một điều. Chỉ các local URL mới được chấp nhận. Nếu bạn cung cấp bất cứ một URL ngoài nào, phương thức này sẽ trả về một lỗi InvalidOperationException. Điều này tránh việc bị tất công open redirect attack. ACTION RESULT CONTROLLER METHOD STATUS CODE LocalRedirectResult LocalRedirect 302 Found (Temporarily moved) LocalRedirectPermanent 301 Moved Permanently LocalRedirectPermanentPreserveMethod 308 Permanent Redirect LocalRedirectPreserveMethod 307 Temporary Redirect Ví dụ:
RedirectToActionResultAction result này chuyển client đến một action và controller cụ thể. Nó nhận một tên Action method, một tên controller và các giá trị tham số: ACTION RESULT CONTROLLER METHOD STATUS CODE RedirectToActionResult RedirectToAction 302 Found (Temporarily moved) RedirectToActionPermanent 301 Moved Permanently RedirectToActionPermanentPreserveMethod 308 Permanent Redirect RedirectToActionPreserveMethod 307 Temporary Redirect Ví dụ:
0 RedirectToRouteResultAction result này chuyển khách hàng đến một route cụ thể. Nó nhận tên route, giá trị của route và chuyển chúng ta đến vị trí mà route cung cấp: ACTION RESULT CONTROLLER METHOD STATUS CODE RedirectToRouteResult RedirectToRoute 302 Found (Temporarily moved) RedirectToRoutePermanent 301 Moved Permanently RedirectToRoutePermanentPreserveMethod 308 Permanent Redirect RedirectToRoutePreserveMethod 307 Temporary Redirect Ví dụ:
1 Trả về fileFileResult là một Action result sử dụng bởi Controller action để trả về file cho người dùng. FileResultFileResult là một base class sử dụng để gửi file nhị phân về response. Nó là một abstract class được triển khai bởi FileContentResult, FileStreamResult, VirtualFileResult, và PhysicalFileResult. Các class này đảm nhiệm công việc gửi file về client. FileContentResultFileContentResult đọc một mảng byte và trả về như một file:
2 FileStreamResultFileStreamResult đọc một luồng stream và trả về một file:
3 VirtualFileResultAction result này đọc nội dung của một file từ một đường dẫ ntuowng đối của ứng dụng trên hosting và gửi nội dung về client dưới dạng 1 file:
4 PhysicalFileResultAction result này đọc nội dung của một file từ một vị trí vật lý và gửi nội dung về client như một file. Chú ý là đường dẫ phải là đường dẫn tuyệt đối:
5 Content ResultJsonResultAction result này trả về dữ liệu được định dạng JSON. Nó chuyển một object sang JSON và trả nó về client:
6 ContentResultContentResult ghi một nội dung cụ thể trực tiếp vào response như một chuỗi định dạng văn bản thuần.
7 EmptyResultEmptyResult giống như tên của nó không chứa cái gì cả. Sử dụng nó khi bạn muốn thực thi một số logic trong controller nhưng không muốn trả về gì.
8 Trả về lỗi và HTTP CodeLoại Action result này được dùng trong Web API Controller. Kết quả sẽ được gửi về kèm HTTP Status Code. Một trong số chúng thì có thể gửi một đối tượng vào response. StatusCodeResultStatusCodeResult gửi kết quả và chỉ ra một HTTP Status code:
9 ObjectResultAction result này sẽ trả về một đối tượng kèm một HTTP Status Code là 200. Nó là một overload của method StatusCode
0 OkResultAction result này trả về nguyên chỉ có HTTP Status code 200:
1 OkObjectResultAction result này trả về một HTTP Status code 200:
2 CreatedResultCreatedResult sử dụng khi một tài nguyên được tạo ra sau request Post. Nó gửi trạng thái 201 về kèm đối tượng vừa được tạo:
3 CreatedAtActionResultCái này tương tự CreatedResult nhưng nó nhận vào Controller và Action thay vì URL:
4 CreateAtRouteResultAction Result này nhận vào gái trị route và tương tự như CreatedResult và CreatedAtActionResult
5 BadRequestResultAction result này gửi về một HTTP Status code 400 cho client. Sử dụng response status code này khi chỉ ra cú pháp không đúng hoặc một request không được rõ ràng.
6 BadRequestObjectResultAction result này tương tự BadRequestResult. Khác nhau là bạn có thể gửi về một ModelStateDictionary (chứa chi tiết lỗi) và cũng là status 400:
7 Phương thức BadRequest có một overload thứ 2, trả về một BadRequestObjectResult NotFoundResultAction result này trả về lỗi HTTP 404 cho client:
8 NotFoundObjectResultAction result này tương tự nuhw NotFoundResult nhưng trả về một đuối tượng kèm lỗi 404. Overload thứ 2 của NotFound giúp nhận một đối tượng làm tham số để trả về NotFoundObjectResult.
9 UnsupportedMediaTypeResultAction result này gửi về lỗi HTTP 415. Sử dụng action result này khi request với định dạng không được hỗ trợ bởi server.
0 NoContentResultAction result này gửi lỗi HTTP 204 về. Sử dụng NoContentResult này khi request thành công nhưng không có nội dung nào được trả về
1 Kết quả liên quan bảo mậtSignInResultSignInResult là kết quả của hành động đăng nhập. SignInManager.SignInAsync hoặc PasswordSignInAsync trả về một SignInResult. Nó có 4 thuộc tính là Succeeded, IsLockedOut, IsNotAllowed và RequiresTwoFactor Bạn có thể tham khảo về ASP.NET Identity Core. SignOutResultSignOutResult là kết quả của hành động logout ForbitResultForbitResult trả về lỗi 403 tức là người dùng không được cấp quyền để thực hiện một hành động nào đó trên tài nguyên nào đó. ForbitResult không có nghĩa là người dùng chưa chứng thực. Người dùng chưa chứng thực nên trả về ChallengeResult hoặc UnAuthorisedResult.
2 Forbit là phương thức của Controller base class trả về thể hiện của ForbidResult. Thay vào đó bạn có thể trả về Status Code:
3 ChallengeResultChallengeResult trả về khi chứng thực thất bại. Kết quả sẽ không gọi đến baatscuws middleware nào để tạo response. Ví dụ trả về lỗi 401 (Unauthorized) hoặc 403 (Forbidden) hoặc chuyển hướng người dùng đến trang đăng nhập. UnauthorizedResultUnauthorizedResult trả về lỗi “401 – Unauthorized”. Controller sử dụng phương thức Unauthorized để trả về thể hiện của UnauthorizedResult.
4 Khác nhau giữa UnauthorizedResult và ChallengeResult là một thằng trả về Status Code còn 1 thằng là không làm gì với nó. |