Khi xây dựng các ứng dụng web hiện đại, việc chọn lựa mô hình kiến trúc phần mềm phù hợp là rất quan trọng. Một trong những kiến trúc được sử dụng phổ biến và hiệu quả nhất hiện nay là MVC (Model-View-Controller). Trong .NET Core, MVC được tích hợp sẵn và hỗ trợ lập trình viên tạo ra các ứng dụng web mạnh mẽ, dễ bảo trì và mở rộng. Bài viết này sẽ giúp bạn hiểu rõ mô hình MVC trong .NET Core và cách nó hoạt động để tối ưu hóa quá trình phát triển ứng dụng.
1. Mô Hình MVC Là Gì?
MVC là viết tắt của Model-View-Controller. Đây là một mẫu kiến trúc phần mềm phân tách ứng dụng thành ba phần riêng biệt:**
Model: Đại diện cho dữ liệu và logic xử lý dữ liệu. View: Giao diện người dùng, hiển thị dữ liệu từ Model. Controller: Điều khiển luồng dữ liệu giữa Model và View, xử lý các yêu cầu từ người dùng và trả lại kết quả. Mô hình MVC được tạo ra để tăng tính linh hoạt trong phát triển phần mềm, giúp tách biệt rõ ràng giữa logic xử lý, dữ liệu và giao diện người dùng. Điều này làm cho ứng dụng dễ dàng bảo trì và mở rộng khi cần thêm tính năng mới.
2. Cấu Trúc Cơ Bản Của MVC Trong .NET Core
2.1. Model
Model chịu trách nhiệm quản lý dữ liệu và logic nghiệp vụ của ứng dụng. Đây là nơi bạn sẽ thực hiện các thao tác như truy xuất dữ liệu từ cơ sở dữ liệu, xử lý các quy tắc nghiệp vụ và quản lý trạng thái của ứng dụng.
Ví dụ, nếu bạn xây dựng một ứng dụng quản lý sản phẩm, Product sẽ là một Model chứa các thuộc tính như Name, Price, Description và các logic liên quan đến sản phẩm đó.
public class Product
{ public int Id { get; set; } public string Name { get; set; } public decimal Price { get; set; } public string Description { get; set; }
}
2.2. View
View chịu trách nhiệm hiển thị dữ liệu từ Model đến người dùng thông qua giao diện người dùng. View trong MVC chỉ tập trung vào việc hiển thị, không chứa logic xử lý dữ liệu hay luồng điều khiển. Trong .NET Core, View thường được viết bằng Razor, một cú pháp cho phép nhúng C# vào HTML.
Ví dụ, một View hiển thị thông tin về sản phẩm có thể trông như thế này:
@model Product <h2>@Model.Name</h2>
<p>Price: @Model.Price</p>
<p>Description: @Model.Description</p>
2.3. Controller
Controller chịu trách nhiệm điều khiển luồng dữ liệu giữa Model và View. Khi người dùng gửi một yêu cầu (request) đến ứng dụng, Controller sẽ nhận yêu cầu, xử lý nó, truy cập Model để lấy dữ liệu cần thiết, và cuối cùng trả về View để hiển thị cho người dùng.
Controller thường chứa các phương thức hành động (action methods) để xử lý các yêu cầu từ người dùng. Ví dụ, một phương thức trong ProductController có thể trông như sau:
public class ProductController : Controller
{ public IActionResult Details(int id) { var product = GetProductById(id); // Lấy dữ liệu từ Model return View(product); // Trả dữ liệu cho View }
}
3. Quy Trình Hoạt Động Của MVC
Quy trình hoạt động của mô hình MVC trong .NET Core diễn ra theo các bước sau:
Người dùng gửi yêu cầu: Khi người dùng gửi một yêu cầu (chẳng hạn nhấp vào một liên kết hoặc gửi form), yêu cầu đó được chuyển tới Controller. Controller xử lý yêu cầu: Controller sẽ nhận yêu cầu từ người dùng, xử lý nó và tương tác với Model để lấy dữ liệu cần thiết. Lấy dữ liệu từ Model: Controller sẽ gọi các phương thức trong Model để truy xuất hoặc cập nhật dữ liệu từ cơ sở dữ liệu. Trả dữ liệu cho View: Sau khi có dữ liệu từ Model, Controller sẽ trả về một View để hiển thị dữ liệu đó cho người dùng. Hiển thị View cho người dùng: View nhận dữ liệu từ Controller và hiển thị nó dưới dạng giao diện người dùng HTML.
Hệ thống tách biệt rõ ràng giữa dữ liệu (Model), giao diện (View) và luồng điều khiển (Controller), giúp ứng dụng dễ dàng bảo trì và phát triển.
4. Ví Dụ Cụ Thể Trong .NET Core
4.1. Tạo Model
Trong ứng dụng quản lý sản phẩm, bạn có thể tạo một Model Product như sau:
public class Product
{ public int Id { get; set; } public string Name { get; set; } public decimal Price { get; set; } public string Description { get; set; }
}
4.2. Tạo Controller
Tạo một Controller ProductController để xử lý các yêu cầu liên quan đến sản phẩm:
public class ProductController : Controller
{ // Giả lập một danh sách sản phẩm private static List<Product> products = new List<Product> { new Product { Id = 1, Name = "Laptop", Price = 1500, Description = "High-end laptop" }, new Product { Id = 2, Name = "Smartphone", Price = 800, Description = "Flagship smartphone" } }; public IActionResult Index() { // Trả về danh sách sản phẩm cho View return View(products); } public IActionResult Details(int id) { // Tìm sản phẩm theo ID và trả về chi tiết var product = products.FirstOrDefault(p => p.Id == id); if (product == null) { return NotFound(); } return View(product); }
}
4.3. Tạo View
Tạo các View để hiển thị dữ liệu cho người dùng.
Index.cshtml - Hiển thị danh sách sản phẩm:
@model List<Product> <h2>Product List</h2>
<ul> @foreach (var product in Model) { <li> <a href="/Product/Details/@product.Id">@product.Name</a> - $@product.Price </li> }
</ul>
Details.cshtml - Hiển thị chi tiết sản phẩm:
@model Product <h2>@Model.Name</h2>
<p>Price: $@Model.Price</p>
<p>Description: @Model.Description</p>
4.4. Kết Nối Cơ Sở Dữ Liệu Với Entity Framework (Tùy Chọn)
Trong một ứng dụng thực tế, bạn có thể kết nối Model với cơ sở dữ liệu thông qua Entity Framework. Để làm điều này, bạn cần cài đặt Entity Framework và cấu hình kết nối với cơ sở dữ liệu trong Startup.cs.
Ví dụ, kết nối một bảng Products với Model Product có thể thực hiện như sau:
Cài đặt Entity Framework:
dotnet add package Microsoft.EntityFrameworkCore.SqlServer
dotnet add package Microsoft.EntityFrameworkCore.Tools
Tạo lớp ApplicationDbContext để quản lý cơ sở dữ liệu:
public class ApplicationDbContext : DbContext
{ public DbSet<Product> Products { get; set; } public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { }
}
Thêm kết nối cơ sở dữ liệu trong Startup.cs:
public void ConfigureServices(IServiceCollection services)
{ services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); services.AddControllersWithViews();
}
Thêm chuỗi kết nối vào appsettings.json:
"ConnectionStrings": { "DefaultConnection": "Server=.;Database=MyApp;Trusted_Connection=True;"
}