FluentValidation เป็น Library ยอดนิยมสำหรับ Validation แบบ Strongly-typed Fluent Interface ใน .NET
ติดตั้ง
dotnet add package FluentValidation
// หรือ PackageReference
<PackageReference Include="FluentValidation" Version="11.9.0" />
Validators สำหรับ String Length
| Method | ความหมาย | Placeholder |
|---|---|---|
MaximumLength(n) |
ความยาวต้อง ≤ n | {MaxLength}, {TotalLength}, {PropertyName}, {PropertyValue} |
MinimumLength(n) |
ความยาวต้อง ≥ n | {MinLength}, {TotalLength}, {PropertyName}, {PropertyValue} |
Length(min, max) |
ความยาวต้องอยู่ระหว่าง min-max | {MinLength}, {MaxLength}, {TotalLength}, {PropertyName}, {PropertyValue} |
ตัวอย่างโค้ดเต็ม
using FluentValidation;
using FluentValidation.Results;
using System;
using System.Collections.Generic;
public class PersonModel
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
public class PersonValidator : AbstractValidator<PersonModel>
{
public PersonValidator()
{
// FirstName: Max 7 ตัวอักษร
RuleFor(p => p.FirstName)
.MaximumLength(7)
.WithMessage("'{PropertyName}' ต้องไม่เกิน {MaxLength} ตัวอักษร (ปัจจุบัน: {TotalLength})");
// LastName: Min 5 ตัวอักษร
RuleFor(p => p.LastName)
.MinimumLength(5)
.WithMessage("'{PropertyName}' ต้องมีอย่างน้อย {MinLength} ตัวอักษร (ปัจจุบัน: {TotalLength})");
// รวม: Length ระหว่าง 2-50
RuleFor(p => p.FirstName)
.Length(2, 50)
.WithMessage("'{PropertyName}' ความยาวต้องอยู่ระหว่าง {MinLength}-{MaxLength} ตัวอักษร");
}
}
static void Main()
{
var person = new PersonModel
{
FirstName = "TestUser444", // 11 chars - เกิน Max 7
LastName = "TTT" // 3 chars - น้อยกว่า Min 5
};
var validator = new PersonValidator();
ValidationResult result = validator.Validate(person);
if (!result.IsValid)
{
foreach (var failure in result.Errors)
{
Console.WriteLine($"[{failure.PropertyName}] {failure.ErrorMessage}");
}
}
else
{
Console.WriteLine("Validation Passed!");
}
}
ผลลัพธ์
[FirstName] 'FirstName' ต้องไม่เกิน 7 ตัวอักษร (ปัจจุบัน: 11)
[LastName] 'LastName' ต้องมีอย่างน้อย 5 ตัวอักษร (ปัจจุบัน: 3)
Advanced: Cascade Mode
RuleFor(p => p.FirstName)
.Cascade(CascadeMode.StopOnFirstFailure) // หยุดที่ Rule แรกที่ Fail
.NotEmpty()
.MaximumLength(50)
.Matches("^[a-zA-Z ]+$"); // Regex
Best Practices
- แยก Validator Class ต่อ Model (Single Responsibility)
- ใช้
WithMessageกับ Placeholders ให้ข้อความชัดเจน - ใน ASP.NET Core:
services.AddFluentValidationAutoValidation()+services.AddValidatorsFromAssemblyContaining<Program>() - รองรับ Async Validation:
MustAsync,CustomAsync - Localization: ใช้
WithMessageกับ Resource Files
สรุป
MaximumLength: ขีดจำกัดบนMinimumLength: ขีดจำกัดล่างLength(min, max): ช่วง (Inclusive)- Placeholders ช่วยให้ Error Message Dynamic และ Informative