比如,只有身高超过130的儿童,才需要验证是否购票,则可以通过如下的代码实现:
RuleFor(x => x.Height).GreaterThan(130).DependentRules(() => { RuleFor(x => x.HasTicket).NotEmpty(); }); 高级用法 异步验证在某些情况下,你可能希望定义异步规则,比如从数据库或者外部api判断。
public StudentValidator(IStudentService studentService) { _studentService = studentService; RuleFor(x => x.Name).MustAsync(async (name, token) => await _studentService.CheckExist(name)); }上述代码中,通过一个异步方法的返回值验证Name属性。
另外,如果在非Controller场景下使用,则必须调用ValidateAsync方法进行验证。
您可以在对属性值执行验证之前使用 Transform方法转换属性值。
RuleFor(x => x.Weight).Transform(x => int.TryParse(x, out int val)?(int?)val:null).GreaterThan(10);上述代码先试图将string类型转换成int类型,如果转换成功则对转换后的值做大于验证。如果转换失败,则不做验证。
回调如果验证失败,可以使用回调做一些操作。
RuleFor(x => x.Weight).NotEmpty().OnFailure(x => { Console.WriteLine("验证失败"); }); 预验证如果需要每次调用验证器前运行特定代码,可以通过重写PreValidate方法来做到这一点。
public class StudentValidator : AbstractValidator<Student> { public StudentValidator() { RuleFor(x => x.Weight).NotEmpty(); } protected override bool PreValidate(ValidationContext<Student> context,ValidationResult result) { if (context.InstanceToValidate == null) return true; result.Errors.Add(new ValidationFailure("", "实体不能为null")); return false; } }福禄ICH.架构出品