Sinh viên sẽ thực hiện hoàn chỉnh hệ thống validation cho lớp Employee sử dụng:
DataAnnotations có sẵn
Custom Validation Attribute cho BirthDate
Remote Validation cho Email và EmployeeNo
Tạo lớp nhân viên biểu diễn thông tin nhân viên (Employee) bao gồm:
ID
Mã nhân viên (EmployeeNo)
Họ tên (FullName)
Website
Ngày sinh (BirthDate)
Giới tính (Gender)
Lương (Salary)
Là nhân viên bán thời gian (IsPartTime) : true/false
Địa chỉ (Address)
Điện thoại (Phone)
Số tài khoản (CreditCard)
Thông tin thêm (Description): tối đa 255 kí tự
Yêu cầu validation sử dụng DataAnnotations có sẵn:
EmployeeNo: Required, StringLength(5-20)
FullName: Required, StringLength(max=100)
Email: Required, EmailAddress, Remote validation
Website: Url
Salary: Range(0, ∞)
Phone: Phone + Regex Việt Nam
CreditCard: CreditCard
Bổ sung thuộc tính kiếm tra ngày sinh phải đủ 18 tuổi (tính theo năm) trở lên.
Định nghĩa và hoàn thiện thuộc tính kiểm tra BirthDateCheck
public class BirthDateCheckAttribute : ValidationAttribute
{
// Constructor với ErrorMessage mặc định
// Override IsValid() kiểm tra:
// 1. Ngày sinh bắt buộc
// 2. Tuổi >= 18 (DateTime.Now.Year - BirthDate.Year >= 10)
// Truy cập BirthDate qua validationContext.ObjectInstance
}
Áp dụng cho property BirthDate lớp Emplpyee
[Display(Name = "Ngày sinh")]
[DataType(DataType.Date)]
[BirthDateCheck] // ← Custom attribute của bạn
public DateTime BirthDate { get; set; }
Tạo 2 Action trong EmployeesController:
1. CheckEmailExists(string email) → Kiểm tra Email trùng
2. CheckEmployeeNoExists(string employeeNo) → Kiểm tra EmployeeNo trùng
Cấu trúc Action Remote:
public IActionResult CheckEmailExists(string email)
{
// 1. Validate input null/empty
if (string.IsNullOrEmpty(email))
return Json("Email là bắt buộc");
// 2. Query DbContext kiểm tra tồn tại
var exists = _context.Employees.Any(e => e.Email == email);
// 3. return Json("Lỗi...") nếu trùng
if (exists)
return Json("Email đã tồn tại");
// 4. return Json(true) nếu unique
return Json(true);
}
public IActionResult CheckEmployeeNoExists(string employeeNo)
{
if (string.IsNullOrEmpty(employeeNo))
return Json("Mã nhân viên là bắt buộc");
var exists = _context.Employees.Any(e => e.EmployeeNo == employeeNo);
if (exists)
return Json("Mã nhân viên đã tồn tại");
return Json(true);
}
Sinh viên sẽ tích hợp jQuery Validate Plugin vào form HTML đăng ký để thực hiện client-side validation với các quy tắc validation cụ thể.
Cho form đăng ký thành viên (html) như sau:
<form>
<h2 class="text-center text-danger">
Đăng ký Thành viên
</h2>
<div class="row m-1">
<div class="col-4 col-md-3 text-right">Mã sinh viên</div>
<div class="col-8 col-md-9">
<input name="MaSV" placeholder="Mã sinh viên" class="w-100" />
</div>
</div>
<div class="row m-1">
<div class="col-4 col-md-3 text-right">Họ tên</div>
<div class="col-8 col-md-9">
<input name="HoTen" placeholder="Họ tên Sinh viên" class="w-100" />
</div>
</div>
<div class="row m-1">
<div class="col-4 col-md-3 text-right">Ngày sinh</div>
<div class="col-8 col-md-9">
<input name="NgaySinh" class="w-100" />
</div>
</div>
<div class="row m-1">
<div class="col-4 col-md-3 text-right">Email</div>
<div class="col-8 col-md-9">
<input name="Email" placeholder="Email" class="w-100" />
</div>
</div>
<div class="row m-1">
<div class="col-4 col-md-3 text-right">Xác nhận email</div>
<div class="col-8 col-md-9">
<input name="XacNhanEmail" placeholder="Xác nhận email" class="w-100" />
</div>
</div>
<div class="row m-1">
<div class="col-4 col-md-3 text-right">Số tài khoản</div>
<div class="col-8 col-md-9">
<input name="SoTaiKhoan" placeholder="Số tài khoản" class="w-100" />
</div>
</div>
<div class="row m-1">
<div class="col-4 col-md-3 text-right">Hình</div>
<div class="col-8 col-md-9">
<input type="file" name="Hinh" />
</div>
</div>
<div class="row m-1">
<div class="col-4 col-md-3 text-right">Điểm</div>
<div class="col-8 col-md-9">
<input name="Diem" placeholder="Điểm" class="w-100" />
</div>
</div>
<div class="row m-1">
<div class="col-4 col-md-3 text-right">Hệ số</div>
<div class="col-8 col-md-9">
<input name="HeSo" placeholder="Hệ số" class="w-100" />
</div>
</div>
<div class="row m-1">
<div class="col-4 col-md-3 text-right">Mã bảo mật</div>
<div class="col-8 col-md-9">
<span></span>
<input name="MaBaoMat" placeholder="Mã bảo mật" class="w-100" />
</div>
</div>
<div class="row m-1">
<div class="col-4 col-md-3 text-right">Thông tin thêm</div>
<div class="col-8 col-md-9">
<textarea name="ThongTinThem" class="w-100"></textarea>
</div>
</div>
<div class="row m-1">
<div class="col-4 col-md-3 text-right"></div>
<div class="col-8 col-md-9">
<button class="btn btn-success">Đăng ký</button>
<button class="btn btn-danger" type="reset">Nhập lại</button>
</div>
</div>
</form>
Yêu cầu: Implement jQuery Validate với các quy tắc sau:
✅Mã sinh viên (MaSV) Bắt buộc, > 6 ký tự required, minlength: 6
✅Họ tên (HoTen): Bắt buộc required
✅Ngày sinh (NgaySinh) Đúng định dạng ngày date
✅Email Bắt buộc, email, chỉ Gmail required, email, custom method gmail
✅Xác nhận email (XacNhanEmail) Giống Email equalTo: "[name='Email']"
✅Số tài khoản (SoTaiKhoan) 16 chữ số custom method creditcardVN
✅Hình (Hinh) gif,jpg,png extension: "gif,jpg,jpeg,png"
✅Điểm (Diem) Số thực 0.0-10.0 number, range: [0.0, 10.0]
✅Hệ số (HeSo) Số nguyên > 0 digits, min: 1
✅Mã bảo mật (MaBaoMat) Giống mã random sinh ra remote (giả lập)
✅Ghi chú (ThongTinThem) < 255 ký tự maxlength: 255
Custom Methods bắt buộc implement:
// 1. Gmail validation
$.validator.addMethod("gmail", function(value, element) {
// Regex chỉ chấp nhận @gmail.com
return this.optional(element) || /^[\w\.-]+@gmail\.com$/.test(value);
}, "Chỉ chấp nhận email Gmail");
// 2. Credit card VN (16 chữ số)
$.validator.addMethod("creditcardVN", function(value, element) {
// Regex /^\d{16}$/
return this.optional(element) || /^\d{16}$/.test(value);
}, "Số tài khoản phải 16 chữ số");