ASP.NET MVC 5: Thêm Controller


MVC được viết tắt từ model-view-controller.  MVC là một mẫu thiết kế cho việc phát triển các ứng dụng có kiến trúc tốt, dễ kiểm lỗi và dễ bảo trì. Một ứng dụng MVC chứa các thành phần sau:

  • Models: Là các lớp dùng để biểu diễn dữ liệu và có thể có các phép kiểm tra để đảm bảo dữ liệu chứa trong nó phù hợp với logic của ứng dụng.
  • Views: Các file template dùng để tạo ra nội dung HTML.
  • Controllers: Các lớp xử lý các yêu cầu từ trình duyệt, lấy về các Model, và chọn View tương ứng để trả về cho trình duyệt.

Chúng ta sẽ cùng khám phá các khái niệm này trong loạt bài này và tôi sẽ cho bạn thấy các dùng chúng để xây dựng một ứng dụng.

Hãy bắt đầu bằng việc tạo một lớp controller. Trong Solution Explorer, nhấn nút phải vào thư mục Controllers và nhấn lên Add, sau đó là Scaffold.

Trong hộp thoại Add Scaffold, nhấn lên MVC 5  Controller – Empty, và nhấn lên Add.


Đặt tên controller của bạn là “HelloWorldController” và nhấn Add.

add controller

Trong Solution  Explorer sẽ xuất hiện một file có tên HelloWorldController.cs.  File này cũng sẽ được mở ra trong cửa sổ IDE.

Thay thế nội dung của file với đoạn code sau:

using System.Web;
using System.Web.Mvc; 

namespace MvcMovie.Controllers 
{ 
    public class HelloWorldController : Controller 
    { 
        // 
        // GET: /HelloWorld/ 

        public string Index() 
        { 
            return "This is my <b>default</b> action..."; 
        } 

        // 
        // GET: /HelloWorld/Welcome/ 

        public string Welcome() 
        { 
            return "This is the Welcome action method..."; 
        } 
    } 
}

Các phương thức của controller sẽ trả về một chuỗi ví dụ ở dạng HTML. Controller này được đặt tên là HelloWorldController và phương thức đầu tiên có tên Index. Chúng ta sẽ thử gọi từ trình duyệt. Nhấn F5 hay Control-F5 để chạy ứng dụng. Trong cửa sổ trình duyệt, Nối thêm “HelloWorld” và đường dẫn trên thanh địa chỉ. (Ví dụ, trong hình minh họa bên dưới, nó sẽ là http://localhost:1234/HelloWorld). Trang hiển thị trong trình duyệt sẽ trông giống ảnh chụp màn hình bên dưới. Trong phương thức ở trên, mã lệnh của bạn trả về trực tiếp một chuỗi, khi đó hệ thống hiểu rằng bạn muốn trả về một đoạn HTML.

ASP.NET MVC gọi các lớp controller khác nhau (và các phương thức khác nhau bên trong) tùy thuộc vào chuỗi URL. Quy tắc phân tích chuỗi URL mặc nhiên được dùng bởi ASP.NET sử dụng định dạng kiểu như sau để xác định phương thức/lớp nào sẽ được gọi:

/[Controller]/[ActionName]/[Parameters]

Bạn có thể thay đổi định dạng này tại  App_Start/RouteConfig.cs  file.

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

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

Khi bạn chạy ứng dụng và không cung cấp thêm phần đường dẫn nào trong URL, nó sẽ mặc nhiên chỉ đến controller có tên “Home” và gọi đến phương thức mặc định “Index”.

Phần đầu tiên của URL xác định lớp controller nào được gọi, do vậy /HelloWorld maps  sẽ chỉ đến lớpHelloWorldController. Phần thứ hai xác định phương thức nào được gọi. Do vậy /HelloWorld/Index sẽ thực thi phương thức “Index” của controller “HelloWorld”. Nhớ là chúng ta chỉ yêu cầu trình duyệt mở đường dẫn /HelloWorld và phương thức Index sẽ mặc nhiên được gọi. Đó là vì phương thức có tên Index sẽ được gọi trong trường hợp chúng ta không chỉ rõ tên phương thức. Phần thứ ba dược dùng để truyền tham số và chúng ta sẽ xem phần này sau.

Mở trang http://localhost:xxxx/HelloWorld/Welcome.  Phương thức Welcome sẽ chạy và trả về chuỗi “This is the Welcome action method…”.  MVC sẽ mặc nhiên ánh xạ theo kiểu /[Controller]/[ActionName]/[Parameters].  Với URL ta vừa mở,  controller là HelloWorld và Welcome là phương thức (action method). Bạn chưa dùng đến [Parameters].

Hãy thử sửa lại ví dụ trên một chút để bạn có thể truyền một vài tham số từ trên URL đến controller (ví dụ: /HelloWorld/Welcome?name=Scott&numtimes=4). Thay đổi phương thức Welcome để có thêm hai tham số như dưới đây. Ghi chú là trong code C# bạn có sử dụng đến tham số tùy chọn để chỉ ra numTimes sẽ mang giá trị 1 nếu không có giá trị nào được truyền cho nó.

public string Welcome(string name, int numTimes = 1) {
     return HttpUtility.HtmlEncode("Hello " + name + ", NumTimes is: " + numTimes);
}

Chạy lại ứng dụng và gõ vào thanh địa chỉ URL ví dụ (http://localhost:xxxx/HelloWorld/Welcome?name=Scott&numtimes=4). Bạn có thể thử các giá trị khác cho tên và numTimes trên URL. Hệ thống model binding trong ASP.NET sẽ tự động ánh xạ các tham số trên chuỗi query string (đoạn phía sau dấu ? trên URL) trên thanh địa chỉ vào các tham số cùng tên trong phương thức của bạn.

Trong ví dụ mẫu ở trên, các tham số được truyền trên query string, ta sẽ thử sửa lại để sử dụng cách truyền ngay theo phân đoạn URL (URL segment).

Thay thế phương thức Welcome với đoạn code sau:

public string Welcome(string name, int ID = 1)
{
    return HttpUtility.HtmlEncode("Hello " + name + ", ID: " + ID);
}

Chạy ứng dụng và nhập vào URL:  http://localhost:xxx/HelloWorld/Welcome/3?name=Rick

Lần này, đoạn URL thứ ba sẽ được khớp với tham số ID, vì phương thức Welcome có một tham số khớp với đặc tả URL được mô tả trong phương thức RegisterRoutes.

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

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

In ASP.NET MVC applications, it’s more typical to pass in parameters as route  data (like we did with ID) than passing them as query strings. You could also  add a route to pass both the name and numtimes in  parameters as route data in the URL. In the App_Start\RouteConfig.cs  file, add the “Hello” route:

Trong ứng dụng ASP.NET MVC, thường người ta hay truyền tham số bằng cách sử dụng route data (như ta dùng với ID) hơn là đưa chúng vào query string. Bạn cũng có thể thêm một route để truyền cả name và numtimes vào tham số như route data trên URL. Trong file App_Start\RouteConfig.cs , thêm một cách chuyển hướng tên là “Hello”:

public class RouteConfig
{
   public static void RegisterRoutes(RouteCollection routes)
   {
      routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

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

      routes.MapRoute(
           name: "Hello",
           url: "{controller}/{action}/{name}/{id}"
       );
   }
}

Chạy ứng dụng và mở trang /localhost:XXX/HelloWorld/Welcome/Scott/3.

Với nhiều ứng dụng MVC, chỉ cần sử dụng cách chuyển hướng mặc nhiê (default route)n là đủ. Bạn sẽ được học cách truyền dữ liệu dử dụng Model binder, và sẽ không cần phải sửa lại default route nữa.

Trong các ví dụ vừa rồi, ta đã dùng phần “VC” của MVC – tức phần view và controller, Controller trực tiếp trả về nội dung HTML. Thường thì bạn không muốn controller trả về HTML theo kiểu này, vì nó sẽ rất khó để code. Thay vì vậy, chúng ta sẽ sử dụng các file template riêng cho view để tạo ra dữ liệu HTML trả về. Hãy xem phần tiếp theo để xem ta làm cách này như thế nào.

Người dịch: Đào Hải Nam – http://www.asp.net/mvc/tutorials/mvc-5/introduction/adding-a-controller

3 thoughts on “ASP.NET MVC 5: Thêm Controller

  1. Chào anh! Em đang theo dõi loạt bài MVC5 này của anh, mong anh sớm update đầy đủ các bài viết để em được học hỏi :D. Em cũng đang tìm hiểu về MVC3, không biết MVC3 và MVC5 này khác nhau nhiều ko ạ, còn MVC4 nữa. Em mù mờ trong mấy cái Framework MVC này wa’, không biết phải bắt đầu bằng cái nào là tốt nhất và tiện cho công việc sau này. Mong anh giải đáp giúp thắc mắc. Nếu được, em có thể trao đổi vs anh wa email được ko ạ, vì có nhiều vấn đề mà trên mạng lại ít có giải đáp, nếu có cũng toàn English, mà em thì lại yếu Eng :). Cảm ơn anh!

  2. Đã có bài mới rồi nhé 😉
    Tất nhiên qua mỗi phiên bản MVC đều có cải tiến, tuy nhiên ở góc độ người mới học, những gì sử dụng đều cơ bản thì nó chẳng có gì khác nhau cả. Bắt đầu bằng cái nào cũng được.
    Nếu cần hỏi em có thể post ngay lên blog này, anh sẽ cố gắng trả lời nếu có thể.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s