Chương 6: ASP.NET MVC — Lập trình ứng dụng Web


1. Giới thiệu về .NET

.NET là gì?

.NET là một nền tảng phát triển phần mềm miễn phí, mã nguồn mở được phát triển bởi Microsoft. Nó bao gồm một tập hợp các thư viện lớp (class libraries), runtime, và công cụ hỗ trợ lập trình viên xây dựng nhiều loại ứng dụng khác nhau.

.NET hỗ trợ nhiều ngôn ngữ lập trình, trong đó phổ biến nhất là:

  • C# — ngôn ngữ chính, hiện đại, hướng đối tượng
  • F# — ngôn ngữ lập trình hàm (functional programming)
  • Visual Basic — ngôn ngữ dễ học, thân thiện với người mới

Các loại ứng dụng có thể xây dựng với .NET

  • Web apps và web services (chạy trên Windows, Linux, macOS, Docker)
  • Mobile apps (iOS, Android, Windows)
  • Desktop apps (Windows, macOS)
  • Microservices chạy trong Docker containers
  • Game 2D/3D
  • Machine Learning (thị giác máy tính, xử lý giọng nói, mô hình dự đoán)
  • Cloud services
  • IoT (Internet of Things), hỗ trợ Raspberry Pi

Ba nhánh chính của .NET

NhánhMô tả
.NET FrameworkRa đời sớm nhất, hỗ trợ website, ứng dụng desktop Windows
Mono / XamarinDành cho phát triển ứng dụng di động (mobile)
.NET Core (từ 2013)Đa nền tảng (cross-platform), chạy trên Windows, Linux, macOS

Nên chọn .NET Core hay .NET Framework?

  • Nếu ứng dụng là Windows Desktop → dùng .NET Framework
  • Nếu ứng dụng là Web Server → cả hai đều được, nhưng .NET Core được khuyến nghị vì đa nền tảng
  • .NET Core có ít thư viện hơn .NET Framework, nhưng đang ngày càng được bổ sung
  • Tuyệt đối không dùng Mono/Xamarin để chạy Web Server

2. ASP.NET

ASP.NET là gì?

ASP.NET là phần mở rộng của nền tảng .NET, cung cấp thêm các công cụ và thư viện chuyên biệt để xây dựng ứng dụng webdịch vụ web (web services).

ASP.NET hỗ trợ:

  • ASP.NET Web Forms — mô hình lập trình web theo sự kiện (event-driven), giống WinForms
  • ASP.NET Web Pages (Razor) — trang web nhúng code C# trực tiếp vào HTML
  • ASP.NET Web API — xây dựng RESTful API
  • ASP.NET MVC — áp dụng mô hình Model–View–Controller

ASP.NET (.NET Framework) vs ASP.NET Core

Đây là hai nền tảng khác nhau, không được nhầm lẫn:

ASP.NET (.NET Framework)ASP.NET Core
Nền tảngChỉ WindowsWindows, Linux, macOS, Docker
Hiệu năngThấp hơnCao hơn đáng kể
Mã nguồn mởMột phầnHoàn toàn
Hỗ trợ tương laiMaintenance onlyĐang phát triển tích cực

ASP.NET Razor

Razor là một cú pháp template cho phép nhúng code C# (hoặc VB) vào bên trong HTML để tạo ra nội dung động phía server.

  • File Razor có phần mở rộng .cshtml (C#) hoặc .vbhtml (VB)
  • Dễ học, dễ sử dụng, được hỗ trợ IntelliSense trong Visual Studio

Ví dụ một đoạn Razor hiển thị danh sách dạng bảng:

<table class="table">
    <thead>
        <tr>
            <th>@Html.DisplayNameFor(model => model.Name)</th>
            <th>@Html.DisplayNameFor(model => model.PhoneNumber)</th>
            <th>@Html.DisplayNameFor(model => model.Email)</th>
        </tr>
    </thead>
    <tbody>
        @foreach (var item in Model)
        {
            <tr>
                <td>@Html.DisplayFor(modelItem => item.Name)</td>
                <td>@Html.DisplayFor(modelItem => item.PhoneNumber)</td>
                <td>@Html.DisplayFor(modelItem => item.Email)</td>
            </tr>
        }
    </tbody>
</table>

Cú pháp @ là dấu hiệu chuyển từ HTML sang code C#. Razor engine sẽ xử lý phía server và trả về HTML thuần cho client.


3. Mô hình MVC

MVC là gì?

MVC (Model – View – Controller) là một mẫu thiết kế kiến trúc phần mềm (architectural design pattern) giúp tách ứng dụng thành ba thành phần riêng biệt nhưng phối hợp với nhau.

Mục tiêu chính: tách biệt logic nghiệp vụ, giao diện, và điều phối luồng xử lý để dễ phát triển, bảo trì và mở rộng.

Ba thành phần của MVC

Model

  • Chịu trách nhiệm về dữ liệu và logic nghiệp vụ
  • Kết nối và tương tác với cơ sở dữ liệu (thêm, sửa, xóa, truy vấn)
  • Không biết gì về View hay cách hiển thị dữ liệu
  • Ví dụ: class SinhVien, SanPham, các phương thức truy vấn database

View

  • Chịu trách nhiệm về giao diện người dùng (UI)
  • Hiển thị dữ liệu nhận từ Controller
  • Nhận tương tác từ người dùng (click, nhập form…) và gửi đến Controller
  • Trong ASP.NET MVC, View thường là các file .cshtml (Razor)

Controller

  • Đóng vai trò điều phối trung gian giữa Model và View
  • Nhận request từ người dùng
  • Gọi Model để lấy hoặc xử lý dữ liệu
  • Chọn View phù hợp và truyền dữ liệu vào đó để trả về response

Luồng hoạt động của MVC

sequenceDiagram participant User participant Controller participant Model participant View User->>Controller: Gửi HTTP Request Controller->>Model: Yêu cầu dữ liệu / xử lý nghiệp vụ Model-->>Controller: Trả về dữ liệu Controller->>View: Truyền dữ liệu, chọn View View-->>User: Trả về HTML Response

Ưu và nhược điểm của MVC

Ưu điểm:

  • Dễ bảo trì và nâng cấp: vì ba thành phần độc lập, thay đổi giao diện không ảnh hưởng logic nghiệp vụ và ngược lại
  • Tách biệt rõ ràng giữa xử lý giao diện, cơ sở dữ liệu và chức năng
  • Chuyên nghiệp, phù hợp làm việc nhóm — frontend và backend có thể phát triển song song
  • Dễ kiểm thử (unit test) vì các thành phần tách biệt

Nhược điểm:

  • Cài đặt phức tạp hơn so với các mô hình đơn giản như Web Forms
  • Tốc độ xử lý có thể chậm hơn một chút so với không áp dụng MVC, do chi phí điều phối giữa các tầng

4. ASP.NET MVC

Cấu trúc thư mục — ASP.NET MVC (.NET Framework)

Khi tạo một project ASP.NET MVC với .NET Framework, Visual Studio sinh ra cấu trúc thư mục chuẩn sau:

Thư mụcMục đích
App_DataChứa dữ liệu cục bộ: LocalDB, file .mdf, file XML
App_StartChứa các file cấu hình khởi động (RouteConfig, BundleConfig…)
ContentChứa file CSS, hình ảnh. Mặc định có Bootstrap CSS
ControllersChứa các Controller. Tên file bắt buộc kết thúc bằng Controller
ModelsChứa các class Model — ánh xạ với bảng trong CSDL
ScriptsChứa file JavaScript. Mặc định có jQuery, Bootstrap JS
ViewsChứa các Razor page (.cshtml) — giao diện người dùng

Cấu trúc thư mục — ASP.NET MVC (.NET Core)

Với .NET Core, cấu trúc gọn hơn, không còn App_Data, App_Start, Content, Scripts riêng biệt:

MVCWeb/
├── Connected Services
├── Dependencies
├── Properties
├── wwwroot/          ← thay thế Content + Scripts (static files)
├── Controllers/
├── Models/
├── Views/
├── appsettings.json  ← cấu hình ứng dụng (connection string, logging...)
├── Program.cs        ← điểm khởi động ứng dụng
└── Startup.cs        ← cấu hình middleware, DI container

Điểm khác biệt chính:

  • wwwroot/ chứa toàn bộ static files (CSS, JS, hình ảnh) thay cho Content/Scripts/
  • appsettings.json thay thế Web.config
  • Startup.cs cấu hình pipeline và dependency injection
  • Program.cs là entry point của ứng dụng

Ví dụ một Controller cơ bản

using System.Web.Mvc;

namespace MyWebsiteMVC.Controllers
{
    public class HomeController : Controller
    {
        // Xử lý GET /Home/Index
        public ActionResult Index()
        {
            ViewBag.Message = "Chào mừng đến với ASP.NET MVC!";
            return View(); // Trả về Views/Home/Index.cshtml
        }

        // Xử lý GET /Home/About
        public ActionResult About()
        {
            return View();
        }
    }
}

Ví dụ một View tương ứng (Index.cshtml)

@{
    ViewBag.Title = "Trang chủ";
}

<h2>@ViewBag.Title</h2>
<p>@ViewBag.Message</p>

Ví dụ một Model cơ bản

namespace MyWebsiteMVC.Models
{
    public class SinhVien
    {
        public int MaSV { get; set; }
        public string HoTen { get; set; }
        public string Email { get; set; }
        public int NamSinh { get; set; }
    }
}

Quy tắc routing mặc định

ASP.NET MVC dùng URL routing để ánh xạ URL đến Controller và Action tương ứng. Quy tắc mặc định:

/{controller}/{action}/{id}

Ví dụ:

  • /Home/IndexHomeController.Index()
  • /SinhVien/Details/5SinhVienController.Details(5)
  • / (root) → HomeController.Index() (mặc định)

5. Tổng kết

graph TD A[.NET Platform] --> B[.NET Framework] A --> C[.NET Core] A --> D[Mono / Xamarin] B --> E[ASP.NET MVC .NET Framework] C --> F[ASP.NET Core MVC] E --> G[Model] E --> H[View .cshtml] E --> I[Controller] F --> G F --> H F --> I