[ASP.NET Core] - Razor Page - Let's think straight
Khi bạn cần tạo thật nhanh một cái website có các page cần thiết mà không cần phải quan tâm tới các vấn đề phức tạp như mô hình, bảo mật, mở rộng, thì Razor Page chính là câu trả lời
1. Yêu cầu
- .NET Core 2.0 trở lên
- Visual Studio Code
- Đọc sơ qua về Razor Page
2. Mô hình phát triển
Nếu bạn đã là một chiến binh ASP.NET lâu năm, thì chắc hẳn bạn sẽ quen thuộc với mô hình MVC, viết tắt cho Model-View-Controller. Ở Razor Page, bạn sẽ làm quen với một mô hình hoàn toàn mới và vô cùng đơn giản (đơn giản tới mức ko có gì để học luôn)
Mô hình MVC
Nếu bạn muốn làm quen với mô hình MVC, có thể đọc bài viết [ASP.NET for Beginner] – Part 1 – MVC
‘Mô hình’ Razor Page
3. Các vấn đề của MVC
3.1. Fat Controller
Giả sử bạn có một controller xử lý các tác vụ liên quan tới giao dịch chuyển tiền giữa các tài khoản, tạm gọi là TransactionController
Có 4 thao tác cơ bản đối với 1 dòng dữ liệu: Create-Read-Update-Delete, tới đây thì ok không vấn đề gì
Pặc, bạn muốn xử lý thêm việc nạp thẻ điện thoại, chi trả hóa đơn điện, nước, internet => thêm các phương thức như NapTheCao
, TraTienDien
, TraTienNuoc
, TraTienInternet
. 2 tuần sau, bạn lại muốn thêm vài tính năng khác, tất cả đều liên quan tới transaction.
Càng về sau, TransactionController
càng dài, và nó đã chính thức được gọi tên là Fat Controller.
3.2. Chia cấp
Mô hình MVC cho bạn một folder tên Controllers
để chứa tất cả các controller của bạn. Điều này sd4 tương ứng với 1 cấp địa chỉ trên URL
Với ví dụ transaction phía trên, URL của bạn sẽ có dạng: domain/transaction/create
Nếu bạn muốn 1 cấp sâu hơn, ví dụ như domain/transaction/phones/create
thì sao? Bạn phải hoặc customize lại route, hoặc tạo một Area
tên Transaction
, và tách các function liên quan với nhau thành từng controller khác nhau.
3.3. Duplicate
Đối với một form bất kỳ, trong mô hình mvc luôn phải có 2 action tương ứng với 2 hành động là Get và post, và người ta thường đặt tên 2 action này giống nhau cho dễ phân biệt với các tính năng khác trong cùng một controller. Điều này đôi khi gây ra những bất tiện nhất định, và bạn bắt buộc phải khai báo attribute [HttpGet]
và [HttpPost]
4. Razor Page Coding conventions
Tương tự như MVC, Razor Page cũng có một số coding conventions
Conventions
MVC
RAZOR PAGES
Default View
Index.cshtml
Index.cshtml
return default view
return View();
return Page();
Http Verbs
[HttpGet]
[HttpPost]
OnGet();
OnPost();
Bind dữ liệu
ViewModel
[BindProperty]
Generate Link
Url.Action(…)
Url.Page(…)
multiple action for form submit
Not built-in
asp-page-handler=“TestHandler”
OnTestHandler()
5. The future is now?
Razor Page, theo đánh giá của mình, chỉ phù hợp với các project vừa và nhỏ, với các view đơn giản về mật logic.
Tại phiên bản .NET CORE 2.0, Razor Page vẫn chưa hỗ trợ một số tính năng mà MVC đang có như sau
- IActionFilter
- Output Cache
- IgnoreAntiforgeryToken attribute (bạn có thể tham khảo thêm tại github issue này để biết cách tắt toàn bộ)