Controller và Actions trong ứng dụng ASP.NET MVC

Nền tảng ASP.NET MVC ánh xạ các URL đến các lớp được gọi là controller. Các controller được dùng để xử lý các request gọi đến, quản lý dữ liệu được nhập bởi người dùng, tương tác, và thực thi logic ứng dụng hợp lý. Một lớp controller thường gọi các view để sinh ra mã HTML trả về cho request.

Lớp cơ bản nhất được các controller kế thừa có tên là ControllerBase, lớp này cung cấp các mã quản lý mô hình MVC chung nhất. Lớp Controller được kế thừa từ ControllerBase, và là lớp mặc định dùng cho việc cài đặt controller. Lớp Controller có trách nhiệm:

  • TÌm kiếm action thích hợp để gọi và kiểm ra xem thử action đó có thể gọi được hay không.
  • Lấy các giá trị được gởi lên từ request để sử dụng như là tham số cho các action
  • Xử lý tất cả các lỗi có thể xảy ra trong suốt quá trình thực thi phương thức action.
  • Cung cấp lớp RazorViewEngine mặc định để render các view để trả về cho trình duyệt.

Các lớp controller bạn tạo ra bắt buộc phải có tên kết thúc bằng “Controller”. Ví dụ sau đây cho thấy cái đặt của một lớp controller đơn giản có tên là HomeController. Lớp Controller này chứa các phương thức action để tạo ra các view trả về cho trình khách.

[HandleError]
public class HomeController : Controller
{
    public ActionResult Index()
    {
        ViewData["Message"] = "Welcome to ASP.NET MVC!";

        return View();
    }

    public ActionResult About()
    {
        return View();
    }
}

Các phương thức Action
Trong các ứng dụng ASP.NET không sử dụng nền tảng MVC, sự tương tác của người dùng được tổ chức theo các trang và theo việc phát ra và quản lý các sự kiện của trang và các điều khiển trên trang đó. Để so sánh, thì với các mô hình MVC, sự tương tác với người dùng được tổ chức theo các controllers và các action của chúng. Lớp controller sẽ định nghĩa các phương thức action. Các controller có thể có bao nhiêu action tùy nhu cầu.

Các phương thức action thường được ánh xạ 1-1 với các tương tác của người dùng. Ví dụ như người dùng điền một URL vào trình duyệt, hoặc nhấn vào một liên kết, hoặc gởi lên một form. Các tương tác nói trên tạo ra request được gởi lên cho server. Khi đó, URL của request được gởi lên sẽ có các thông tin mà nền tảng MVC sẽ sử dụng để tìm kiếm và thực thi phương thức action.

Khi người dùng gõ một URL vào trình duyệt, ứng dụng MVC sẽ sử dụng các quy tắc định tuyến (routing rules) được định nghĩa ở tập tin Global.asax để phân tích URL và xác định đường dẫn của controller. Sau đó controller sẽ xác định action tương ứng để xử lý request. Ví dụ như, trong trường người dùng gõ vào địa chỉ URL là http://d.jou.vn/Products/Index thì đường dẫn con là /Products/Detail/5. Tuyến mặc định (default routing) sẽ xem Products như là phần tiền tố của tên controller, nghĩa là controller được chọn có tên là ProductsController. Và “Detail” được xem như là tên của action, như vậy thì phương thức Detail của ProductsController sẽ được thực thi để xử lý request. Theo tuyến mặc định, thì giá trị “5” trong URL sẽ được truyền vào phương thức Detail như là một tham số.

Ví dụ dưới đây cho thấy cài đặt của một action có tên là HelloWorld

public class MyController : Controller
{
    public ActionResult HelloWorld()
    {
        ViewBag.Message = "Hello World!";
        return View();
    }
}

Kiểu trả về ActionResult

Phần lớn các phương thức action đều trả về một đối tượng thuộc lớp kế thừa từ lớp ActionResult. Lớp ActionResult là lớp cơ sở cho các kết quả trả về của các action. Tuy nhiên, có nhiều loại kết quả trả về từ action. Ví dụ, phần lớp các action khi được gọi đều trả về lời gọi phương thức View. Phương thức View sẽ trả về một đối tượng của lớp ViewResult, lớp này lại là lớp kế thừa từ ActionResult.

Bạn có thể tạo các phương thức action có thể trả về một đối tượng thuộc bất kỳ kiểu nào, có thể là kiểu chuỗi, số nghuyên, hay là kiểu bool. Các kết quả trả về sẽ được bọc bởi một đối tượng kế thừa từ lớp ActionResult trước khi chúng được trả về cho response stream.

Bảng dưới đây liệt kê các kiểu action result đựn sẳn và các phương thức hỗ trợ để trả về chúng:

Action Result Phương thức trợ giúp Mô tả
ViewResult View Trả về view như là một trang web
PartialViewResult PartialView Trả về như là một phần của trang web
RedirectResult Redirect Chuyển đến các action khác bằng cách sử dụng URL của chúng
RedirectToRouteResult RedirectToAction \n RedirectToRoute Chuyển đến một action khác
ContentResult Content Trả về một kiểu dữ liệu do người dùng định nghĩa
JsonResult Json Trả về một đối tượng được kết xuất theo định dạng JSON
JavaScriptResult JavaScript Trả về đoạn mã javascript để có thể thực thi được ở client
FileResult File Trả về kết quả nhị phân để ghi lên kết quả trả về
EmptyResult (Không có) Đại diện cho giá trị trả về mà nó được dùng khi phương thức action phải trả về một giá trị null.

Đánh dấu các phương thức công để chúng không được xem là các action

Mặc định, MVC sẽ xem tất cả các phương thức public của controller như là action. Nếu lớp controller của bạn có chứa phương thức public như bạn lại không muốn nó là một action, bạn phải sử dụng thuộc tính NonActionAttribute để quy định.

[NonAction]
private void DoSomething()
{
    // Method logic.
}

Các tham số truyền vào phương thức action

Các giá trị được truyền qua tham số của các action được lấy từ tập dữ liệu của đối tượng request, từ đối tượng RouteData và từ form dữ liệu được gởi lên. Nếu giá trị tham số không được truyền vào, và nếu kiểu dữ liệu của tham số là một kiểu tham chiếu (reference type) hoặc là một kiểu dự liệu có thể chấp nhận giá trị null, thì null sẽ được gởi vào như là giá trị của tham số. Ngược lại, sẽ có ngoại lệ được ném ra.

Ngoài cách truy xuất bằng cách tham số được định nghĩa một cách tường mình, bạn có thể sử dụng các thuộc tính Response và Request của lớp Controller để truy xuất đến các tham số. Hai tham số này chính là hai đối tượng HttpResponse và HttpRequest.

Đoạn mã ví dụ dưới đây cho thấy cách sử dụng đối tượng Request để lấy về giá trị của tham số có tên là id:

public void Detail()
{
    int id = Convert.ToInt32(Request["id"]);
}

Tự động ánh xạ các tham số của action

Nền tảng ASP.NET MVC có thể tự động ánh xạ tham số từ URL đến các tham số của action. Khi bạn định nghĩa action có tham số, nền tảng MVC sẽ kiểm tra dữ liệu của request và sác định xem có giá trị nào trùng tên với các tham số không, nếu có thì sẽ lấy các giá trị đó để tuyền vào các tham số.

Ví dụ dưới đây sẽ không sử dụng Request[“id”] như ở phương thức ví dụ ở trên, thay vào đó, action sẽ được quy định tham số id một cách tường minh, và MVC sẽ tự động ánh xạ giá trị của Request[“id”] vào tham số id:

public ResultAction Detail(int id)
{
    ViewData["DetailInfo"] = id;
    return View();
}

Bạn cũng có thể thêm tham số như là một phần của URL thay vì sử dụng các chuỗi truy vấn. Ví dụ, thay vì sử dụng /Products/Detail?id=3, bạn có thể sử dụng một URL có dạng /Products/Detail/3. Quy tắc ánh xạ tuyến mặc định có định dạng là /{controller}/{action}/{id}. Và lúc đó 3 sẽ là giá trị của tham số id.

Ngoài ra bạn cũng có thể quy định kiểu chấp nhận giá trị (null-able type) để truyền các tham số có thể không có giá trị được gởi lên như sau:

public ActionResult ShowArticles(DateTime? date)
{
    if(!date.HasValue)
    {
        date = DateTime.Now;
    }
    // ...
}

Ở ví dụ trên, nếu không có giá trị nào được truyền lên với tên là date, thì date sẽ được kiểm tra và gán cho giá trị là ngày tháng hiện tại.

Như vậy, chúng ta đã cùng nhau tìm hiểu các kía cạnh cơ bản của action và các kiểu ActionResult cũng như về các truy xuất các giá trị được gởi lên ở request.

Controller và Actions trong ứng dụng ASP.NET MVC
5 (100%) 10 votes

Add Comment