CRUD – Create, Retrieve, Update, Delete – là nhóm chức năng cơ bản nhất của các ứng dụng quản lý (Line-of-Business, LOB). Trong Razor Pages, bạn rất dễ dàng thực hiện nhóm chức năng CRUD dữ liệu cơ bản.
Trong bài thực hành tổng hợp thứ nhất, bạn đã xây dựng được một phần của ứng dụng quản lý sách điện tử. Cụ thể, bạn đã hiển thị được danh sách tài liệu ở dạng bảng và hiển thị được thông tin chi tiết của từng tài liệu. Đây tương ứng với chức năng R – Retrieve trong CRUD.
Trong bài thực hành này chúng ta tiếp tục xây dựng nốt 3 chức năng xử lý dữ liệu còn lại: Create, Update và Delete. Qua bài thực hành này chúng ta sẽ xem xét cách vận dụng loạt kiến thức đã học trong các bài trước khi xây dựng chương trình MVC.
Kết thúc bài thực hành này bạn sẽ thu được một ứng dụng đơn giản với đủ 4 chức năng CRUD dữ liệu cơ bản.
Video hướng dẫn và mã nguồn ở phần kết luận.
− Cách 1: Cài đặt bằng console: + Tools → NuGet Package Manager → Package Manager Console (PMC):
+ Gõ câu lệnh sau vào PMC, sau đó nhấn phím Enter:
Install-Package Microsoft.EntityFrameworkCore.SqlServer
− Cách 2: Cài đặt bằng giao diện:
− Cách 2: Cài đặt bằng giao diện:
+ Mục Browse, tìm package Microsoft.EntityFrameworkCore.SqlServer
+ Cài đặt phiên bản ổn định mới nhất (Latest stable) của package này.
Lưu ý:
− .NET 6.0 tương thích với các NuGet Package có phiên bản là 6.x.x.
− Việc cài đặt các NuGet package cần phải có kết nối Internet.
− NuGet Package chỉ có tác dụng với project hiện tại
− Bước 1 – Tạo chuỗi kết nối đến CSDL: Mở file appsettings.json và bổ sung chuỗi kết nối có tên là Eshop như sau, trong đó mục Server và Database lần lượt là tên máy chủ SQL và tên CSDL:
"ConnectionStrings": { "BookStore": "Server=DESKTOP-VC92P42\\SQLEXPRESS;Database=BookStore_CKC;Trusted_Connection=True;MultipleActiveResultSets=true" }
− Bước 2 – Xây dựng Context: Tạo thư mục Data trong project, trong đó tạo class BookStoreContext kế thừa từ class DbContext, kèm theo 1 phương thức khởi tạo cũng kế thừa từ phương thức khởi tạo tương ứng của DbContext:
− Bước 3 – Thiết lập service: Bổ sung câu lệnh sau vào phần thiết lập dịch vụ của file Program.cs để quy định project sẽ sử dụng EshopContext với chuỗi kết nối có tên là Eshop từ file appsettings.json:
builder.Services.AddDbContext(options => options.UseSqlServer(builder.Configuration.GetConnectionString("BookStore")));
Khởi tạo CSDL lần đầu
Để dùng được migration, cần cài package sau: Microsoft.EntityFrameworkCore.Tools.
Đầu tiên, tạo class Books trong thư mục Models:
Tiếp theo, trong class BookStoreContext, cần khai báo model Book dưới dạng 1 thuộc
tính của class này, với kiểu dữ liệu là DbSet
public DbSet < Book > Books { get; set; }
Để tạo migration, gõ lệnh sau vào PMC:Add-Migration Init
Sau khi migration đã được tạo ra, gõ lệnh sau vào PMC để tạo ra CSDL lần đầu:
Update-Database
Chúng ta bắt đầu với chức năng xóa dữ liệu.
Workflow của chức năng này xuất phát từ trang Index:
=> người dùng click vào nút hoặc đường link tương ứng
=> hiển thị thông tin chi tiết của cuốn sách và đề nghị người dùng xác nhận xóa
-> nếu người dùng xác nhận xóa => xóa dữ liệu => quay trở về trang Index
-> nếu người dùng đổi ý => quay trở về trang Index
Thêm khai báo sau vào Controller:
Thực thi phương thức Delete trong Controller:
Sau bước này Controller đã có khả năng xóa bỏ object khỏi tập hợp dữ liệu Books dựa trên giá trị Id của sách.
Thêm link sau vào trang Index:
Chạy thử nghiệm chương trình. Từ trang Index click nút Delete sẽ chuyển đến trang sau:
Đến đây chức năng xóa dữ liệu đã hoàn thành.
Bước 1. Bổ sung khai báo sau vào Controller:
Hai bước này chuẩn bị các phương thức cần dùng cho trang Book.cshtml.
Bước 2. Bổ sung thẻ sau vào trang Index.cshtml:
Bước này đặt đường link mới (Add new book) vào trang Index trước bảng dữ liệu để gọi tới trang Book => phương thức Create.
Bước 4. Tạo view cho trang Create
Chuột phải thư mục Views -> Books-> Add -> View
Bạn cần tạo view Create cho phương thức Create như sau
Đoạn code của view Create sẽ như sau :
Ở đây layout là lớp kế thừa của của trang _Layout
Chúng ta cần định danh đường dẫn action truyền về Controller bằng cách asp-action="Create" asp-controller="Books"
Kết quả của trang Create như sau :
Bước 1. Thêm khai báo sau vào Controller:
public async Task Edit(int? id)
{
if (id == null || _context.Books == null)
{
return NotFound();
}
var book = await _context.Books.FindAsync(id);
if (book == null)
{
return NotFound();
}
return View(book);
}
[HttpPost]
[ValidateAntiForgeryToken]
public async Task Edit(int id, [Bind("Id,TieuDe,TacGia,NhaXuatBan,NamPhatHanh,MoTa")] Book book)
{
if (id != book.Id)
{
return NotFound();
}
if (ModelState.IsValid)
{
try
{
_context.Update(book);
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!BookExists(book.Id))
{
return NotFound();
}
else
{
throw;
}
}
return RedirectToAction(nameof(Index));
}
return View(book);
}
Bước 2. Thêm đường link vào sau nút Delete và Detail:
Sau khi bổ sung các đường dẫn thì đã có các chức năng hoàn chỉnh
Đến đây chức năng cập nhật đã hoàn thành:
Giao diện sửa :
Giao diện xem chi tiết :
Qua bài thực hành này bạn xây dựng được các chức năng CRUD dữ liệu cơ bản nhất của ứng dụng Razor Pages. Qua đây bạn đã vận dụng tương đối đầy đủ các kỹ thuật của Razor, bao gồm phương thức xử lý truy vấn, truy xuất dữ liệu từ truy vấn, model binding.
Dĩ nhiên, các chức năng này còn rất hạn chế và chưa thực tế. Ví dụ, bạn chưa hề kiểm soát dữ liệu người dùng, chưa lưu trữ được dữ liệu, chưa upload/download file sách.
Một vấn đề khá “nghiêm trọng” nữa là mặc dù ứng dụng hoạt động nhưng cách thức chúng ta xây dựng các chức năng CRUD lại không thực sự “tiêu chuẩn”. Để thực hành các tính năng của ASP.NET Core Razor Pages chúng ta đã sử dụng một cách lập trình khác so với cách làm tiêu chuẩn của Razor Pages: Thay vì tạo page riêng rẽ cho từng chức năng, chúng ta dồn tất cả vào trang Book.
Cuối cùng, ứng dụng của chúng ta mặc dù hiển thị được bảng dữ liệu nhưng chưa thể thực hiện các chức năng đi cùng bảng dữ liệu như tìm kiếm, sắp xếp, phân trang.
Tất cả những hạn chế trên sẽ được giải quyết trong bài thực hành tổng hợp tiếp theo.
Bạn có thể xem video hướng dẫn này để tham khảo.