Fluent验证的链接规则
本文关键字:规则 链接 验证 Fluent | 更新日期: 2023-09-27 18:26:41
我已经在使用最新版本的Fluent Validation,它是5.4.0.0;我需要实现的是:
想想车辆VIN,它取决于品牌Id、型号Id和制造年份。在Fluent中,当这些规则成功执行时,我是否有能力基于更多规则执行规则?
如果所有三条规则(品牌、型号和年份)都通过,我必须验证车辆vin。
我也阅读了整个文档,找不到任何实现它的参考资料
class VehicleValidator : AbstractValidator<Vehicle>
{
public VehicleValidator()
{
RuleFor(v => v.MakeId)
.NotEmpty()
.WithMessage("Make Id is required")
RuleFor(v => v.ModelId)
.NotEmpty()
.WithMessage("Model Id is required")
RuleFor(v => v.Year)
.NotEqual(default(ushort))
.WithMessage("Year is required")
RuleFor(v => v)
.MustBeAValidVehicle()
.WithName("Vehicle")
.Unless(v => v.IdMarca == null || v.IdModelo == null && v.Ano == default(short));
RuleFor(v => v.VehicleVin)
.NotEmpty()
.WithMessage("Vehicle Vin is required")
//Only run this validation if the validation of MakeId, ModelId, Year and MustBeAValidVechile don't fail
RuleFor(v => v.VehicleVin)
.MustBeAValidVehicleVin()
.Unless(v => v.Chassi == null || v.IdMarca == null || v.IdModelo == null || v.Ano == default(ushort));
}
}
您可以使用CascadeMode.StopOnFirstFailure
组合VIN验证规则列表,以确保只看到第一个失败。这将阻止任何额外的处理。
public class VinValidator : AbstractValidator<Vin>
{
public VinValidator()
{
RuleFor(x => x.Vin)
.Cascade(CascadeMode.StopOnFirstFailure)
.Must(HaveValidMake).WithMessage("Invalid Make")
.Must(HaveValidModel).WithMessage("Invalid Model")
.Must(HaveValidYear).WithMessage("Invalid Year")
.Must(BeValidVin).WithMessage("Invalid VIN");
}
private bool HaveValidMake(string vin)
{
return vin.Contains("make");
}
private bool HaveValidModel(string vin)
{
return vin.Contains("model");
}
private bool HaveValidYear(string vin)
{
return vin.Contains("year");
}
private bool BeValidVin(string vin)
{
return vin.Length == 17;
}
}
以下示例演示了该行为:
"invalid" => "Invalid Make"
"xxxmakexxx" => "Invalid Model"
"xxxmakemodelxxx" => "Invalid Year"
"xxxmakemodelyearxxx" => "Invalid VIN"
"xxxmakemodelyear" => valid
更新以反映示例代码:
如果AbstractValidator
中没有执行其他验证,则可以将类级属性CascadeMode
设置为StopOnFirstFailure
,以确保验证在第一次失败时停止(请参阅此处)。然后,您可以像在示例代码中那样将验证规则分开。
注意:在测试时,我注意到StopOnFirstFailure没有受到非必须规则的尊重。您可能需要将您的规则转换为Must
,就像我上面提到的那样。
我找到了解决问题的方法。只需创建一个类,该类包含布尔属性以确定是真是假。
请参阅我在FLent验证讨论板上的帖子ValidationResultHolder-规则依赖