Action Selectors & Action Verbs trong ASP.NET Core

Bài viết này chúng ta sẽ tìm hiểu thành phần Action Selector và vai trò của nó trong khi chọn controller action. Trong bài trước chúng ta có tìm hiểu về Routing trong ASP.NET Core. Chúng ta đã học về Routing Engine để chọn controller và action tướng ứng để thực thi request. Các thành phần như Action selector, Action Name, Non-Action và Action Verb sẽ giúp chúng ta thêm công cụ điều khiển cho quá trình URL Matching Process.

Action Selector là gì?

Action selector là một attribute có thể được áp dụng co controller action. Các attribute này giúp Routing Engine chọn đúng action method để xử lý request. ASP.NET Core bao gồm 3 kiểu Action Selector:

  1. Action Name
  2. Non Action
  3. Action Verbs

Action Name

ActionName attribute định nghĩa tên của một action. Routing engine sẽ sử dụng tên này thay vì tên phương thức để match với action name trong routing. Bạn sẽ dùng attribute này khi bạn muốn một alias cho tên phương thức:

[ActionName("Modify")]
public string Edit()
{
    return "Hello from Edit Method";
}

Trong code phía trên, Action Name cho hành đồng Edit được thay đổi sang Modify sử dụng ActionName attribute. Chúng ta có thể không còn gọi phương thức này sử dụng tên Edit. Chúng ta phải sử dụng tên mới là "Modify" trong URL. Nhớ là bạn cũng có thể sử dụng route attribute để thay đổi Action Name:

public class HomeController : Controller
{
    [Route("Home/Modify")]
     public string Edit()
     {
          return "Hello from Edit Method";
     }
}

Non Action

Public method trong class controller được gọi như Action methods. Các phương thức này có thể được gọi bởi bất cứ ai ở bất cứ đâu trên thế giới đơn giản chỉ cần gõ URL lên trình duyệt. Bạn có thể cho Routing Engine biết đó là một phương thức đặc biệt không phải là một Action method bằng cách đặt attribute NonAction như sau:

public class HomeController : Controller
{
    [NonAction]
    public string Edit()
    {
        return "Hello from Edit Method";
    }
}

Action Verbs

Action verbs selector được sử dụng khi bạn muốn điều kiển action method dựa trên HTTP Request method. Điều này được đảm nhiệm sử dụng tập các attribute bởi MVC, ví dụ như HttpGet và HttpPost. Nó được gọi là Http Attributes.

Một số HTTP Verbs có sẵn trong ưng dụng ASP.NET Core. Chúng là GET, POST, PUT, DELETE, HEAD, OPTIONS, PATCH. Mỗi verbs này kết hợp với HTTP Method Attributes được định nghĩa trong namespace Microsoft.AspNetCore.Mvc.Routing.

Bạn có thể áp dụng các attribute này cho Controller action method. Khi khách hàng gửi request sử dụng một verb cụ thể, routing engine sẽ tìm controller action với một attribute tương ứng và gọi nó.

HTTP Attribute cho phép chúng ta định nghĩa 2 phương thức với cùng tên nhưng khác kiểu response với HTTP Verb khác nhau.

Ví dụ tốt nhất là phương thức Edit. Một phương thức Edit trả về một Get Request và tạo ra Edit Form. Phương thức khác nhận Post request và cập nhật database.

[HttpGet]
public ActionResult Edit(string id)
{
    //Return the Edit Form
    return View();
}
 
[HttpPost]
public ActionResult Edit(Model model)
{
    //Update the database here
}

Gán routing value trong HTTP action verbs

Trong bài hướng dẫn trên Attribute routing chúng ta đã tìm hiểu làm sao để cấu hình route trong Route Attribute. Thay vào đó bạn có thể sử dụng HTTP Action verb để làm điều này:

[HttpGet("")]
[HttpGet("Home")]
[HttpGet("Home/Index")]
public string Index() {
    return "Hello from Index method of Home Controller";        
}

HTTP Attribute

Dưới đây là danh sách HTTP Attributes

HttpGet

HttpGet attribute giới hạn Action method chỉ cấp nhận các request sử dụng GET verb. Các tham số trên URL (query string) tự động được thêm vào như các tham số. HttpGet được dùng để nhận một resource từ server.

[HttpGet]
public IEnumerable<product> GetAll()
{
    return db.Products.ToList();
}
 
[HttpGet("{id}"]
public IActionResult GetById(long id)
{
    var product= db.Products.Where(e => e.ProductID == id);
    return View(product);
}

HttpPost

HttpPost attribute giới hạn action method chấp nhận HTTP Request sử dụng Post verb. Post verb được dùng để tạo mới bản ghi.

[HttpPost]
public IActionResult Create(Product product)
{
   if (product == null)
   {
     return BadRequest();
   }
   db.Products.Add(product);
   db.SaveChanges();
   return RedirectToAction("Index");
}

HttpDelete

HttpDelete attribute giới hạn Action method chỉ chấp nhận HTTP Request sử dụng Delete verb. Delete verb được dùng để xóa tài nguyên đang tồn tại

HttpPut

HttpPut attribute giới hạn action method chỉ chấp nhận các HTTP Request sử dụng Put verb. Put verb được dùng để cập nhật hoặc tạo mới tài nguyên.

HttpHead

HttpHead attribute giới hạn action method chỉ chấp nhận HTTP Request sử dụng Head verb. Head verb được dùng để nhận các HTTP Header. Phương thức này được định danh cho GET ngoại trừ các serrver không trả về message body.

HttpOptions

HttpOptions attribute giới hạn action method chỉ chấp nhận các request sử dụng Options verb. Method này nhận thông tin về tùy chọn giao tiếp được hỗ trợ bởi web server.

HttpPatch

HttPatch attribute giới hạn action method chỉ nhận các HTTP Request sử dụng Options verb. Method nà sử dụng cho toàn bộ hoặc một phần việc cập nhật tài nguyên.

Sử dụng nhiều Action Verbs

AcceptVerbs  attribute cho phép sử dụng nhiều action verb trên action method:

[AcceptVerbs(HttpVerbs.Get | HttpVerbs.Post)]
public ActionResult AboutUs()
{
    return View();
}

Tổng kết

Action Name, Non Action và Action Verbs (Được biết đến như là Action Selector) cho chúng ta thêm công cụ điều khiển trong URL Matching Process. Action Verbs hoặc HTTP Attributes được dùng khi bạn muốn điều khiển Action method dựa trên HTTP Request method.

Tác giả: Bạch Ngọc Toàn

Chú ý: Tất cả các bài viết trên TEDU.COM.VN đều thuộc bản quyền TEDU, yêu cầu dẫn nguồn khi trích lại trên website khác.

Lên trên