??FluentValidation模塊支持鏈式驗證方法調用,也就是說,除了 RuleFor(r => r.UserName).NotEmpty()調用方式之外,還可以將對單個屬性的多種驗證函數以鏈式調用方式串接起來,比如UserName屬性不能為空,長度在5~10之間,且不能是test,使用FluentValidation模塊的鏈式驗證方式及運行效果如下所示:
RuleFor(r => .UserName).NotEmpty().MinimumLength(5).MaximumLength(10).NotEqual("test");
??調用繼承自AbstractValidator類的自定義驗證類驗證時,一般調用Validate函數獲取驗證結果及驗證錯誤信息,除此之外,還可以調用ValidateAndThrow函數,當驗證失敗時直接拋ValidationException異常,后者包含類型為IEnumerable<ValidationFailure>的驗證錯誤信息集合,供程序捕獲及處理。
AppUserValidator validationRules = new AppUserValidator();
try
{validationRules.ValidateAndThrow(user);
}
catch (FluentValidation.ValidationException ex)
{MessageBox.Show(ex.Message);
}
??FluentValidation模塊支持兩種方式驗證復雜類型的屬性,方式1是為每種類型定義相應的驗證類,并在上一級類型的驗證類構造函數中調用SetValidator函數指定類型屬性的驗證,方式2是在上一級類型的驗證類構造函數中按屬性層級設置需要驗證的規則(官網說明中提到第2種方式要手動增加屬性的非null條件驗證,否則就不會對下一級屬性進行自動驗證,但是測試時并沒有出現這種情況,可以正常運行AppUser實例對象的驗證),這兩種方式的使用示例和效果如下所示:
public class AppUser
{public string UserName { get; set; }public string Sex { get; set; }public int Age { get; set; }public string Email { get; set; }
}public class AppInfo
{public string AppName { get; set; }public AppUser User { get; set; }
}public class AppInfoalidator : AbstractValidator<AppInfo>
{//方式1public AppInfoalidator() {RuleFor(x=>x.AppName).NotEmpty();RuleFor(x=>x.User).SetValidator(new AppUserValidator());}//方式2public AppInfoalidator() {RuleFor(x=>x.AppName).NotEmpty();RuleFor(x=>x.User.UserName).NotEmpty().MinimumLength(5).MaximumLength(10).NotEqual("test"); }
}
public class AppUserValidator:AbstractValidator<AppUser>
{public AppUserValidator(){RuleFor(r => r.UserName).NotEmpty().MinimumLength(5).MaximumLength(10).NotEqual("test");}
}
??針對集合類型的屬性,FluentValidation模塊提供了RuleForEach函數驗證集合屬性,針對簡單類型的集合屬性,可以直接調用RuleForEach對每個元素進行驗證,如下所示。
public class AppInfo
{public string AppName { get; set; }public List<string> Roles { get; set; }
}public class AppInfoalidator : AbstractValidator<AppInfo>
{public AppInfoalidator() {RuleFor(x=>x.AppName).NotEmpty();RuleForEach(x => x.Roles).NotEmpty().WithMessage("第{CollectionIndex}個集合元素不能為空").MinimumLength(3).WithMessage("第{CollectionIndex}個集合元素長度不能小于3");}
}AppInfo app = new AppInfo();
app.Roles = new List<string>();
app.Roles.Add(string.Empty);
app.Roles.Add("辦公室主任");
app.Roles.Add("職員");AppInfoalidator appValidator=new AppInfoalidator();
FluentValidation.Results.ValidationResult result =appValidator.Validate(app);
if(!result.IsValid)
{MessageBox.Show(result.ToString());
}
??針對復雜類型的集合屬性,類似于上面復雜類型的屬性驗證方式,既可以調用RuleForEach和SetValidator函數設置每個元素的驗證類,也可以調用 RuleForEach和ChildRules函數直接設置每個元素的驗證方式,這兩種方式的使用示例和效果如下所示:
public class AppUser
{public string UserName { get; set; }public string Sex { get; set; }public int Age { get; set; }public string Email { get; set; }
}public class AppInfo
{public string AppName { get; set; }public List<string> Roles { get; set; }public List<AppUser> Users { get; set; }
}public class AppInfoalidator : AbstractValidator<AppInfo>
{//方式1public AppInfoalidator() {RuleFor(x=>x.AppName).NotEmpty();RuleForEach(x => x.Roles).NotEmpty().WithMessage("角色屬性第{CollectionIndex}個集合元素不能為空").MinimumLength(3).WithMessage("角色屬性第{CollectionIndex}個集合元素長度不能小于3");RuleForEach(x => x.Users).SetValidator(new AppUserValidator());}//方式2public AppInfoalidator() {RuleFor(x=>x.AppName).NotEmpty();RuleForEach(x => x.Roles).NotEmpty().WithMessage("角色屬性第{CollectionIndex}個集合元素不能為空").MinimumLength(3).WithMessage("角色屬性第{CollectionIndex}個集合元素長度不能小于3");RuleForEach(x => x.Users).ChildRules(r =>{r.RuleFor(r => r.UserName).NotEmpty().MinimumLength(5).WithMessage("用戶屬性第{CollectionIndex}個集合元素長度不能小于5").MaximumLength(10).NotEqual("test").WithMessage("用戶屬性第{CollectionIndex}個集合元素值不能等于test");});}
}
public class AppUserValidator:AbstractValidator<AppUser>
{public AppUserValidator(){RuleFor(r => r.UserName).NotEmpty().MinimumLength(5).WithMessage("用戶屬性第{CollectionIndex}個集合元素長度不能小于5").MaximumLength(10).NotEqual("test").WithMessage("用戶屬性第{CollectionIndex}個集合元素值不能等于test");}
}
??
??
參考文獻:
[1]https://docs.fluentvalidation.net/en/latest/start.html