Controller trong ASP.NET MVC

Trong phần này, bạn sẽ tìm hiểu về Controller trong ASP.NET MVC.

Controller trong kiến ​​trúc MVC xử lý mọi URL yêu cầu đến. Controller là một lớp, xuất phát từ lớp cơ sở System.Web.Mvc.Controller.

Lớp controller chứa các phương thức public gọi là các phương thức hành động (action method).

Controller và phương thức hành động của nó xử lý các yêu cầu đến từ trình duyệt, lấy dữ liệu model cần thiết và trả về các phản hồi thích hợp.

Trong ASP.NET MVC, mọi tên lớp của controller phải kết thúc bằng từ "Controller" - đây là quy định bắt buộc.

Ví dụ: Controller cho trang chủ phải là HomeController và Controller cho sinh viên phải là StudentController. Ngoài ra, mỗi lớp controller phải được đặt trong thư mục Controllers của cấu trúc thư mục dự án ASP.NET MVC.

Thêm một Controller mới trong ASP.NET MVC

Bây giờ, hãy thêm một controller trống mới vào ứng dụng ASP.NET MVC của chúng ta trong Visual Studio.

Trong phần trước, chúng ta đã học cách tạo ứng dụng MVC đầu tiên của mình, ứng dụng đã có sẵn HomeController theo mặc định. Bây giờ, chúng ta sẽ tạo một controller mới là StudentController.

Tips: ASP.NET MVC sẽ đưa ra lỗi "The resource cannot be found" khi bạn không thêm từ "Controller" vào sau tên lớp của controller.

Trong Visual Studio, nhấp chuột phải vào thư mục Controllers -> chọn Add -> nhấp vào Controller..

Thêm một Controller mới trong ASP.NET MVC

Điều này sẽ mở hộp thoại Add Scaffold như dưới đây.

Ghi chú: Scaffold là một khung tạo mã tự động cho các ứng dụng web ASP.NET MVC. Scaffold giúp tiết kiệm thời gian bằng cách tự động tạo controller, view, v.v. trong ASP.NET MVC. Bạn có thể tạo scaffold tùy chỉnh bằng cách sử dụng các mẫu T4 theo nhu cầu của bạn.
Thêm một Controller mới trong ASP.NET MVC

Hộp thoại Add Scaffold chứa các mẫu khác nhau để tạo Controller mới. Chúng ta sẽ tìm hiểu về các mẫu khác sau.

Bây giờ hãy chọn "MVC 5 Controller - Empty" và nhấp vào nút Add. Nó sẽ mở hộp thoại Add Controller như hình bên dưới:

Thêm một Controller mới trong ASP.NET MVC

Trong hộp thoại Add Controller, nhập tên của controller. Hãy nhớ rằng, tên controller phải kết thúc bằng Controller. Hãy nhập StudentController và bấm nút Add.

Điều này sẽ tạo lớp StudentController có sẵn phương thức hành động Index trong tập tin StudentController.cs trong thư mục Controllers, như hiển thị trong ví dụ bên dưới.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MVC_BasicTutorials.Controllers
{
    public class StudentController : Controller
    {
        // GET: Student
        public ActionResult Index()
        {
            return View();
        }
    }
}

Như bạn có thể thấy ở trên, lớp StudentController xuất phát từ lớp Controller. Mọi controller trong ASP.NET MVC phải xuất phát từ lớp Controller trừu tượng này.

Lớp Controller cơ sở này chứa các phương thức của trình trợ giúp có thể được sử dụng cho các mục đích khác nhau.

Bây giờ, chúng ta sẽ trả về một chuỗi gì đó từ phương thức hành động Index của StudentController ở trên.

Thay đổi kiểu trả về của phương thức hành động Index từ ActionResult thành string và trả về chuỗi ví dụ được hiển thị trong ví dụ bên dưới. Bạn sẽ tìm hiểu về ActionResult trong phần tiếp theo.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MVC_BasicTutorials.Controllers
{
    public class StudentController : Controller
    {
        // GET: Student
        public string Index()
        {
            return "This is Index action method of StudentController";
        }
    }
}

Chúng ta đã xem trong phần định tuyến rằng URL yêu cầu http://localhost/student hoặc http://localhost/student/index được xử lý bởi phương thức hành động Index() của lớp StudentController được trình bày ở trên.

Vì vậy, hãy nhấn phím F5 để chạy ứng dụng và truy cập nó từ trình duyệt và bạn sẽ thấy trang sau trong trình duyệt.

Thêm một Controller mới trong ASP.NET MVC

Những điểm cần nhớ:

  1. Controller xử lý các URL yêu cầu đến. Định tuyến trong ASP.NET MVC gửi yêu cầu đến phương thức hành động của controller thích hợp dựa trên URL và các tuyến được cấu hình.
  2. Tất cả các phương thức public trong lớp controller được gọi là phương thức hành động.
  3. Một lớp controller phải được bắt nguồn từ lớp System.Web.Mvc.Controller.
  4. Tên lớp controller phải kết thúc bằng "Controller".
  5. Controller mới có thể được tạo bằng các mẫu có sẵn khác nhau. Bạn cũng có thể tự tạo mẫu tùy chỉnh theo nhu cầu của mình.

Phương thức hành động

Trong phần này, bạn sẽ tìm hiểu về phương thức hành động (action method) của lớp controller.

Tất cả các phương thức public của lớp controller được gọi là phương thức hành động. Chúng giống như bất kỳ phương thức bình thường nào khác với các hạn chế sau:

  1. Phương thức hành động phải là public. Nó không thể là private hoặc protected.
  2. Phương thức hành động không thể có nạp chồng phương thức (quá tải phương thức).
  3. Phương thức hành động không thể là một phương thức static.

Sau đây là một ví dụ về phương thức hành động Index của StudentController

Action method trong ASP.NET MVC

Như bạn có thể thấy trong hình trên, phương thức Index là một phương thức public và nó trả về ActionResult bằng phương thức View(). Phương thức View() được định nghĩa trong lớp cơ sở Controller, trả về ActionResult thích hợp.

Phương thức hành động mặc định

Mọi controller có thể có phương thức hành động mặc định theo tuyến được cấu hình trong lớp RouteConfig.

Theo mặc định, Index là một phương thức hành động mặc định cho bất kỳ controller nào, như cấu hình mặc định được trình bày ở ví dụ bên dưới.

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}/{name}",
    defaults: new 
    { 
        controller = "Home", 
        action = "Index", 
        id = UrlParameter.Optional
    });

Tuy nhiên, bạn hoàn toàn có thể thay đổi tên phương thức hành động mặc định theo nhu cầu của bạn trong lớp RouteConfig.

ActionResult trong ASP.NET MVC

ASP.NET MVC bao gồm các lớp kết quả khác nhau, có thể được trả về từ một phương thức hành động.

Có các lớp kết quả đại diện cho các loại phản hồi khác nhau, chẳng hạn như: HTML, tập tin, chuỗi, json, javascript, v.v Bảng sau liệt kê tất cả các lớp kết quả có sẵn trong ASP.NET MVC.

Lớp kết quả Mô tả
ViewResult Đại diện cho HTML.
EmptyResult Đại diện cho không có phản hồi.
ContentResult Đại diện cho chuỗi ký tự.
FileContentResult/ FilePathResult/ FileStreamResult Đại diện cho nội dung của một file.
JavaScriptResult Đại diện cho một tập lệnh JavaScript.
JsonResult Đại diện cho JSON có thể được sử dụng trong AJAX.
RedirectResult Đại diện cho một chuyển hướng đến một URL mới
RedirectToRouteResult Đại diện cho một phương thức hành động khác của cùng hoặc controller khác
PartialViewResult Trả về HTML từ Partial View
HttpUnauthorizedResult Trả về trạng thái HTTP 403

Lớp ActionResult là một lớp cơ sở của tất cả các lớp kết quả ở trên, do đó nó có thể là kiểu trả về của các phương thức hành động trả về bất kỳ loại kết quả nào được liệt kê ở trên. Tuy nhiên, bạn có thể chỉ định lớp kết quả phù hợp làm kiểu trả về của phương thức hành động.

Phương thức Index() của StudentController trong hình trên sử dụng phương thức View() để trả về ViewResult (được kế thừa từ ActionResult). Phương thức View() được định nghĩa trong lớp Controller cơ sở. Nó cũng chứa các phương thức khác nhau, tự động trả về loại kết quả cụ thể như được hiển thị trong bảng dưới đây.

Lớp kết quả Mô tả Phương thức trong lớp Controller
ViewResult Đại diện cho HTML. View()
EmptyResult Đại diện cho không có phản hồi.
ContentResult Đại diện cho chuỗi ký tự. Content()
FileContentResult,
FilePathResult,
FileStreamResult
Đại diện cho nội dung của một file File()
JavaScriptResult Đại diện cho một tập lệnh JavaScript. JavaScript()
JsonResult Đại diện cho JSON có thể được sử dụng trong AJAX Json()
RedirectResult Đại diện cho một chuyển hướng đến một URL mới Redirect()
RedirectToRouteResult Đại diện cho một hành động khác của cùng hoặc khác controller RedirectToRoute()
PartialViewResult Trả về HTML của Partial View PartialView()
HttpUnauthorizedResult Trả về trạng thái HTTP 403

Như bạn có thể thấy trong bảng trên, phương thức View() trả về ViewResult, Phương thức Content() trả về chuỗi, phương thức File() trả về nội dung của tập tin, v.v.

Bạn có thể sử dụng các phương thức khác nhau được đề cập trong bảng trên để trả về các loại kết quả khác nhau từ một phương thức hành động.

Tham số của phương thức hành động

Mỗi phương thức hành động có thể có các tham số đầu vào như các phương thức bình thường. Nó có thể là kiểu dữ liệu nguyên thủy hoặc kiểu dữ liệu phức tạp như trong ví dụ dưới đây.

[HttpPost]
public ActionResult Edit(Student std)
{
    // update student to the database
    
    return RedirectToAction("Index");
}

[HttpDelete]
public ActionResult Delete(int id)
{
    // delete student from the database whose id matches with specified id

    return RedirectToAction("Index");
}

Xin lưu ý rằng tham số phương thức hành động có thể là kiểu Nullable.

Theo mặc định, các giá trị cho tham số của phương thức hành động được lấy từ tập dữ liệu của yêu cầu.

Tập dữ liệu bao gồm các cặp name/values cho form data hoặc các giá trị query string hoặc các giá trị cookie.

Model binding trong ASP.NET MVC tự động ánh xạ chuỗi truy vấn URL hoặc thu thập dữ liệu biểu mẫu thành các tham số của phương thức hành động nếu cả hai có tên khớp nhau. Truy cập phần model binding để biết thêm thông tin về nó.

Những điểm cần nhớ:

  1. Tất cả các phương thức public trong lớp Controller được gọi là phương thức hành động.
  2. Phương thức hành động có những hạn chế sau.
       - Phương thức hành động phải được public. Nó không thể là private hoặc protected.
       - Phương thức hành động không thể có quá tải phương thức.
       - Phương thức hành động không thể là phương thức static.
  3. ActionResult là một lớp cơ sở của tất cả các kiểu kết quả trả về từ phương thức hành động.
  4. Lớp Controller cơ sở chứa các phương thức trả về kiểu kết quả phù hợp, ví dụ: View(), Content(), File(), JavaScript(), v.v.
  5. Phương thức hành động có thể có các tham số kiểu Nullable.

Bộ chọn hành động

Bộ chọn hành động là thuộc tính có thể được áp dụng cho các phương thức hành động. Nó giúp công cụ định tuyến chọn phương thức hành động chính xác để xử lý một yêu cầu cụ thể. MVC 5 bao gồm các thuộc tính bộ chọn hành động sau:

  1. ActionName
  2. NonAction
  3. ActionVerbs

Thuộc tính ActionName

Thuộc tính ActionName cho phép chúng ta chỉ định một tên hành động khác với tên phương thức. Hãy xem xét ví dụ sau.

public class StudentController : Controller
{
    public StudentController()
    {

    }
       
    [ActionName("find")]
    public ActionResult GetById(int id)
    {
        // get student from the database 
        return View();
    }
}

Trong ví dụ trên, chúng tôi đã áp dụng thuộc tính ActioName("find") cho phương thức hành động GetById. Vì vậy, bây giờ, tên hành động là "find" thay vì "GetById".

Phương thức hành động này sẽ được gọi khi URL là http://localhost/student/find/1 thay vì http://localhost/student/getbyid/1.

Thuộc tính NonAction

Thuộc tính NonAction chỉ định phương thức public của controller không phải là phương thức hành động.

Sử dụng thuộc tính NonAction khi bạn muốn phương thức public trong controller nhưng không muốn coi nó là phương thức hành động.

Ví dụ, phương thức public GetStudent() không thể được gọi giống như là một phương thức hành động trong ví dụ sau.

public class StudentController : Controller
{
    public StudentController()
    {

    }
   
    [NonAction]
    public Student GetStudent(int id)
    {
        return studentList.Where(s => s.StudentId == id).FirstOrDefault();
    }
}

Thuộc tính ActionVerbs

Thuộc tính ActionVerbs được sử dụng khi bạn muốn kiểm soát việc lựa chọn phương thức hành động dựa trên phương thức HTTP của yêu cầu.

Ví dụ: bạn có thể định nghĩa hai phương thức hành động khác nhau có cùng tên nhưng một phương thức hành động đáp ứng yêu cầu HTTP GET và phương thức hành động khác đáp ứng yêu cầu HTTP POST.

ASP.NET MVC hỗ trợ các ActionVerbs khác nhau, chẳng hạn như HttpGet, HttpPost, HttpPut, HttpDelete, HttpOptions và HttpPatch.

Bạn có thể áp dụng các thuộc tính này cho phương thức hành động để chỉ ra phương thức HTTP của yêu cầu mà phương thức hành động hỗ trợ.

Nếu bạn không áp dụng bất kỳ thuộc tính nào thì nó sẽ coi đó là một yêu cầu GET theo mặc định.

Hình dưới đây minh họa các động từ hành động HttpGET và HttpPOST.

Thuộc tính ActionVerbs trong ASP.NET MVC

Bảng sau liệt kê việc sử dụng các phương thức http:

Phương thức HTTP Sử dụng
GET Để lấy thông tin từ máy chủ. Các tham số sẽ được nối vào chuỗi truy vấn.
POST Để tạo một tài nguyên mới.
PUT Để cập nhật một tài nguyên hiện có.
HEAD Giống như GET ngoại trừ máy chủ không trả về message body.
OPTIONS Đại diện một yêu cầu cung cấp thông tin về các tùy chọn liên lạc được máy chủ web hỗ trợ.
DELETE Để xóa một tài nguyên hiện có.
PATCH Để cập nhật đầy đủ hoặc một phần tài nguyên.

Truy cập W3.org để biết thêm thông tin về các phương thức HTTP.

Ví dụ sau đây cho thấy các phương thức hành động khác nhau hỗ trợ các ActionVerbs khác nhau:

public class StudentController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    [HttpPost]
    public ActionResult PostAction()
    {
        return View("Index");
    }


    [HttpPut]
    public ActionResult PutAction()
    {
        return View("Index");
    }

    [HttpDelete]
    public ActionResult DeleteAction()
    {
        return View("Index");
    }

    [HttpHead]
    public ActionResult HeadAction()
    {
        return View("Index");
    }
       
    [HttpOptions]
    public ActionResult OptionsAction()
    {
        return View("Index");
    }
       
    [HttpPatch]
    public ActionResult PatchAction()
    {
        return View("Index");
    }
}

Bạn cũng có thể áp dụng nhiều phương thức HTTP bằng thuộc tính AcceptVerbs.  Trong ví dụ sau phương thức GetAndPostAction hỗ trợ cả hai phương thức HTTP GET và HTTP POST:

[AcceptVerbs(HttpVerbs.Post | HttpVerbs.Get)]
public ActionResult GetAndPostAction()
{
    return RedirectToAction("Index");
}

Những điểm cần nhớ:

  1. Công cụ định tuyến ASP.NET MVC sử dụng các thuộc tính bộ chọn hành động để xác định phương thức hành động nào cần gọi.
  2. Ba thuộc tính bộ chọn hành động có sẵn trong MVC 5 là:
      - ActionName
      - NonAction
      - ActionVerbs
  3. Thuộc tính ActionName được sử dụng để chỉ định tên hành động khác với tên phương thức.
  4. Thuộc tính NonAction đánh dấu phương thức public của lớp controller không phải là phương thức hành động.
  5. Thuộc tính ActionVerbs chọn phương thức hành động dựa trên các phương thức HTTP của yêu cầu, ví dụ: POST, GET, PUT, v.v.
  6. Nhiều phương thức hành động có thể có cùng tên với các ActionVerbs khác nhau. Quy tắc quá tải phương pháp được áp dụng.
  7. Nhiều ActionVerbs có thể được áp dụng cho một phương thức hành động bằng cách sử dụng thuộc tính AcceptVerbs.
ASP.NET MVC
Bài Viết Liên Quan:
Lớp HtmlHelper trong ASP.NET MVC
Trung Nguyen 28/05/2020
Lớp HtmlHelper trong ASP.NET MVC

Lớp HtmlHelper trong ASP.NET MVC là gì? Cách sử dụng HtmlHelper để tạo ra các phần tử HTML trong Razor View.

Cú pháp Razor trong ASP.NET MVC
Trung Nguyen 27/05/2020
Cú pháp Razor trong ASP.NET MVC

Cách sử dụng cú pháp Razor để viết mã C# hoặc VB.NET trong Razor View trong ASP.NET MVC.

Tạo View cập nhật trong ASP.NET MVC
Trung Nguyen 27/05/2020
Tạo View cập nhật trong ASP.NET MVC

Tìm hiểu cách tạo view cho chức năng chỉnh sửa thông tin sinh viên trong ASP.NET MVC.

Model Binding trong ASP.NET MVC
Trung Nguyen 26/05/2020
Model Binding trong ASP.NET MVC

Tìm hiểu về Model Binding trong ASP.NET MVC. Tự động nạp các tham số của phương thức hành động.