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)
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
Description: StringLength(max=255)
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);
}
3. Trở lại model thêm thuộc tính kiểm tra dạng Remote:
[Remote(controller:"Employee", action:"CheckEmployeeNoExists", ErrorMessage = "Employee number already exists.")]
public string EmployeeNo { get; set; }
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ố");