CascadeMode.StopOnFirstFailure不生效问题咨询
解决FluentValidation中CascadeMode.StopOnFirstFailure不阻止对象级MustAsync执行的问题
嘿,我之前也踩过这个坑!你设置CascadeMode.StopOnFirstFailure没生效的原因其实很简单:这个级联模式默认只作用于单个属性的规则链,而你写的MustAsync是针对整个Query对象的规则,不在单个属性的规则链里,所以前面的属性验证失败时,它还是会被触发。
下面给你两种可行的解决办法:
方法一:使用DependentRules()关联规则
通过DependentRules()可以把对象级规则和前面的属性规则绑定在一起,只有当前面所有属性验证都通过时,才会执行里面的对象级规则:
public class Validator : AbstractValidator<Query> { public Validator() { CascadeMode = CascadeMode.StopOnFirstFailure; // 先定义属性级的非空规则 RuleFor(x => x.A).NotEmpty(); RuleFor(x => x.B).NotEmpty(); // 用DependentRules包裹对象级规则,确保前面规则通过才执行 RuleFor(x => x).DependentRules(() => { RuleFor(x => x).MustAsync(async (query, cancellationToken) => { // 这里写你的异步验证逻辑 // 示例:return await SomeAsyncValidation(query); return true; }); }); } }
方法二:用WhenAsync()前置条件判断
另一种方式是给MustAsync添加前置条件,只有当A和B都验证通过时,才执行异步验证:
public class Validator : AbstractValidator<Query> { public Validator() { CascadeMode = CascadeMode.StopOnFirstFailure; RuleFor(x => x.A).NotEmpty(); RuleFor(x => x.B).NotEmpty(); RuleFor(x => x) .MustAsync(async (query, cancellationToken) => { // 你的异步验证逻辑 return true; }) .WhenAsync(async (query, cancellationToken) => { // 手动检查A和B的验证结果 var aValidation = await ValidatePropertyAsync(query, x => x.A, cancellationToken); var bValidation = await ValidatePropertyAsync(query, x => x.B, cancellationToken); return aValidation.IsValid && bValidation.IsValid; }); } }
这两种方法都能实现你想要的效果:当前面的NotEmpty规则不满足时,不会触发MustAsync方法。
内容的提问来源于stack exchange,提问作者user1075940
相关产品推荐
相关产品推荐

