logo
Bài 2: Thêm một Controller
SuTieu Offline
#1 Đã gửi : 02/12/2013 lúc 05:19:16(UTC)

Danh hiệu: Gà Trưởng Thành

Gia nhập: 18-02-2011(UTC)
Bài viết: 110
Đến từ: SinhCat.,JSC

Cảm ơn: 10 lần
Được cảm ơn: 25 lần trong 22 bài viết
Cách thêm Controller

(tiếp theo bài 1, nhớ mở lại project của bài 1 trước khi làm tiếp)

MVC là viết tắt của Model - View - Controller
Mô hình MVC hỗ trợ người lập trình phát triển ứng dụng web nhanh chóng, dễ kiểm tra, sửa lỗi và dễ bảo trì.

Một ứng dụng MVC cơ bản sẽ gồm có các thành phần sau:
Models: là các class đại diện cho phần dữ liệu của ứng dụng web và sử dụng class này để kiểm tra các ràng buộc logic cho dữ liệu. Nói chung là các thao tác xử lý code nên ở đây.
Views: là một dạng template động mà ứng dụng web sử dụng nó để sinh ra mã HTML và thể hiện ra trình duyệt web.
Ở đây mình tạo các template dùng chung cho vài trang hoặc toàn bộ trang web, không phải cứ mỗi trang lại ngồi định dạng lại thẻ DIV, table hay css. Làm một lần rồi thôi á :D
Controller: có thể nói là các class nhận yêu cầu từ trình duyệt web, sau đó gửi yêu cầu cho Model, lấy dữ liệu của Model trả về, chỉ định template web, sau đó ghép các dữ liệu này vào đúng chỗ trong template và trả về cho trình duyệt web.

Mình sẽ giới thiệu tất cả các khái niệm này sâu hơn trong các bài tiếp theo, cứ bình tĩnh.
Bây giờ đã hiểu sơ qua về Controller rồi, chúng ta bắt đầu tạo Controller đầu tiên nhé.

Trong Solution Explorer (bên phải), right-click lên folder Controllers và click Add, chọn Controller.



Trong hộp thoại Add Scaffold mới mở ra, click MVC 5 Controller - Empty, và rồi click Add.


Đặt tên cho em controller này là "HelloWorldController" và click Add.



Bây giờ, trong Solution Explorer sẽ có 1 file mới tạo có tên là HelloWorldController.cs và một folder mới tại Views\HelloWorld. Em controller này cũng được tự động mở ra trong IDE (visual studio).



Thay thế nội dung trong file này thành code như 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 (Method) trong controller này đều trả về kiểu string.
controller này có tên là HelloWorldController và Method đầu tiên có tên là Index.
Chạy ứng dụng web lên để xem (nhấn F5 hoặc Ctrl+F5).
Trong thanh địa chỉ của trình duyệt mới mở ra, thêm dòng "HelloWorld" vào sau cùng. (http://localhost:1234/HelloWorld.)
Lưu ý: port 1234 chỉ là demo của mình, port của bạn có thể khác với con số này, giữ nguyên nó, đừng sửa lại port nha.


Lúc nãy bạn thấy trong method Index có dòng này: return "This is my <b>default</b> action...";
Bạn thấy trên trình duyệt nó hiện ra giống vậy không. Nó hiểu cả cái thẻ <b> của HTML nữa á. (<b> là bold, là in đậm)

ASP.NET MVC sẽ gọi các controller khác nhau (và các method khác nhau bên trong nó) phụ thuộc vào cái địa chỉ bạn nhập trên thanh Address của trình duyệt web. Mặc định, ASP.NET MVC sử dụng các khai báo trong file App_Start/RouteConfig.cs
Định dạng mặc định:
/[Tên Controller]/[Tên Action]/[Các Tham Số]

Mở file App_Start/RouteConfig.cs lên xem nào.
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 web lên mà không cung cấp URL chi tiết, nó sẽ tự lấy controller tên là Home và method Index trong đó ra để hiển thị.

Theo ví dụ trên, mình có chỉ định "HelloWorld" ở sau, do đó nó sẽ tìm đến HelloWorldController, nhưng sau "HelloWorld" mình lại không chỉ định thêm gì cả nên nó tự động lấy method Index() trong HelloWorldController ra xài, và kết quả là dòng chữ như chúng ta đã thấy.

Mình dùng cái này: http://localhost:1234/HelloWorld nó tương đương với http://localhost:1234/HelloWorld/Index

Bây giờ thử thay đổi URL trên trình duyệt thành: http://localhost:1234/HelloWorld/Welcome

Lúc này mình sẽ thấy câu "This is the Welcome action method...". (vì có chỉ định Welcome nên nó gọi method Welcome) theo cú pháp /[Tên Controller]/[Tên Action]/[Các Tham Số].

Nãy giờ ví dụ chưa có [Các tham số] nhé, mới đến /[Tên Controller]/[Tên Action] thôi.

Giờ hãy vào Controller, sửa method Welcome giống như sau:

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

Trong này, tại tham số numTimes, nếu không cung cấp thì nó tự lấy giá trị = 1
Trong đoạn code trên, mình có thể dùng: return "Hello " + name + ", NumTimes is: " + numTimes;
Tuy nhiên, thêm HttpUtility.HtmlEncode vào để vô hiệu hóa mấy chú tò mò tấn công SQLInjection, một trò cũ rích nhưng còn hiệu quả

Chạy ứng dụng Web lên lại, nhập URL như sau vào Address: http://localhost:1234/HelloWorld/Welcome?name=Sutieu&numtimes=4

LƯU Ý: ?name=Sutieu&numtimes=4 KHÔNG PHẢI LÀ PARAMETER NÓI TRÊN NHÉ, NÓ LÀ QUERY STRING PARAMETER

Bây giờ thay code Welcome lại giống như sau:

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

Chạy lên lại và thay URL bằng http://localhost:1234/HelloWorld/Welcome/3?name=Sutieu

ĐÂY, ĐÂY, SỐ 3 Ở ĐÂY CHÍNH LÀ PARAMETER NÓI Ở TRÊN, cụ thể là parameter ID

Nó được mô tả trong RegisterRoutes method.

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 }
);
}


//id = UrlParameter.Optional }: nghĩa là tùy chọn, có hay không cũng được

Mình có thể định nghĩa thêm cách xử lý các parameter này trong file App_Start\RouteConfig.cs
Nó gọi là Route

Mở file App_Start\RouteConfig.cs lên, thêm route "Hello" như sau:

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 web lên F5 và thay đổi URL như sau: http://localhost:1234/HelloWorld/Welcome/Scott/3




Thông thường, để Route mặc định là nó chạy tốt rồi, không cần sửa đâu.

Hôm nay mình đã giới thiệu xong về Controller, nó trả dữ liệu thô trực tiếp lên web nhé, hôm sau mình giới thiệu đến phần View, và mình sử dụng View để hiển thị những gì Controller trả về, không chơi trực tiếp như thế này nữa.
Controller trả dữ liệu về cho View, View tổng hợp và trả tất cả về cho trình duyệt web. Mình sẽ chỉ trong bài sau.

DONE.
1 người cảm ơn SuTieu cho bài viết.
ncptbl trên 18-01-2015(UTC) ngày
Ai đang xem chủ đề này?
Guest
Bạn không thể tạo chủ đề mới trong diễn đàn này.
Bạn không thể trả lời chủ đề trong diễn đàn này.
Bạn không thể xóa bài của bạn trong diễn đàn này.
Bạn không thể sửa bài của bạn trong diễn đàn này.
Bạn không thể tạo bình chọn trong diễn đàn này.
Bạn không thể bỏ phiếu bình chọn trong diễn đàn này.

Green-Grey Theme Created by Ingo Herbote (WatchersNET.de)
Powered by YAF | YAF © 2003-2010, Yet Another Forum.NET
Thời gian xử lý trang này hết 0.120 giây.