C# 基于Fluent验证的链接规则
我已经在使用Fluent验证的最新版本,即5.4.0.0;我需要实现的是: 考虑车辆VIN,这取决于制造商Id、型号Id和制造年份。在Fluent中,当成功执行规则时,我是否能够基于更多规则执行规则 如果三条规则(品牌、型号和年份)都通过,我必须验证车辆vin 我也阅读了整个文档,找不到任何实现它的参考C# 基于Fluent验证的链接规则,c#,fluent,fluentvalidation,C#,Fluent,Fluentvalidation,我已经在使用Fluent验证的最新版本,即5.4.0.0;我需要实现的是: 考虑车辆VIN,这取决于制造商Id、型号Id和制造年份。在Fluent中,当成功执行规则时,我是否能够基于更多规则执行规则 如果三条规则(品牌、型号和年份)都通过,我必须验证车辆vin 我也阅读了整个文档,找不到任何实现它的参考 class VehicleValidator : AbstractValidator<Vehicle> { public VehicleValidator() {
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));
}
}
class VehicleValidator:AbstractValidator
{
公共车辆驾驶室()
{
RuleFor(v=>v.MakeId)
.NotEmpty()
.WithMessage(“需要制作Id”)
RuleFor(v=>v.ModelId)
.NotEmpty()
.WithMessage(“需要型号Id”)
规则(v=>v.年)
.NotEqual(默认值(ushort))
.WithMessage(“需要年份”)
规则(v=>v)
.MustBeAValidVehicle()
.使用名称(“车辆”)
除非(v=>v.IdMarca==null | | v.IdModelo==null&&v.Ano==default(short));
规则(v=>v.VehicleVin)
.NotEmpty()
.带有信息(“需要车辆Vin”)
//仅当MakeId、ModelId、Year和MustbeaValidCheckile的验证未失败时,才运行此验证
规则(v=>v.VehicleVin)
.MustBeAValidVehicleVin()
除非(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;
}
}
更新以反映示例代码:
如果在AbstractValidator
中没有执行其他验证,则可以将类级属性CascadeMode
设置为StopOnFirstFailure
,以确保验证在第一次失败时停止(请参阅)。然后,您可以像在示例代码中一样将验证规则分开
注意:在测试时,我注意到StopOnFirstFailure对于非必须规则没有得到尊重。您可能需要将规则转换为我上面提到的Must
s。您可以使用cascade模式组合VIN验证规则列表。StopOnFirstFailure
以确保只看到第一个故障。这将阻止任何额外的处理
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;
}
}
更新以反映示例代码:
如果在AbstractValidator
中没有执行其他验证,则可以将类级属性CascadeMode
设置为StopOnFirstFailure
,以确保验证在第一次失败时停止(请参阅)。然后,您可以像在示例代码中一样将验证规则分开
注意:在测试时,我注意到StopOnFirstFailure对于非必须规则没有得到尊重。您可能需要将规则转换为我上面提到的Must
s。您可以使用cascade模式组合VIN验证规则列表。StopOnFirstFailure
以确保只看到第一个故障。这将阻止任何额外的处理
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;
}
}
更新以反映示例代码:
如果在AbstractValidator
中没有执行其他验证,则可以将类级属性CascadeMode
设置为StopOnFirstFailure
,以确保验证在第一次失败时停止(请参阅)。然后,您可以像在示例代码中一样将验证规则分开
注意:在测试时,我注意到StopOnFirstFailure对于非必须规则没有得到尊重。您可能需要将规则转换为我上面提到的Must
s。您可以使用cascade模式组合VIN验证规则列表。StopOnFirstFailure
以确保只看到第一个故障。这将阻止任何额外的处理
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;
}
}
更新以反映示例代码:
如果在AbstractValidator
中没有执行其他验证,则可以将类级属性CascadeMode
设置为StopOnFirstFailure
,以确保验证在第一次失败时停止(请参阅)。然后,您可以像在示例代码中一样将验证规则分开
注意:在测试时,我注意到StopOnFirstFailure对于非必须规则没有得到尊重。您可能需要将规则转换为我上面提到的Must
s。我找到了解决问题的方法。简单地创建了一个类,该类包含一个布尔属性来确定是真还是假
请参阅我在FLuent验证讨论板上的帖子
我找到了解决问题的方法。简单地创建了一个类,该类包含一个布尔属性来确定是真还是假
请参阅我在FLuent验证讨论板上的帖子
我找到了解决问题的方法。简单地创建了一个类,该类包含一个布尔属性来确定是真还是假
请参阅我在FLuent验证讨论板上的帖子
我找到了解决问题的方法。简单地创建了一个类,该类包含一个布尔属性来确定是真还是假
请参阅我在FLuent验证讨论板上的帖子
如果您想自定义AbstractValidator验证规则的方式,可以在实现AbstractValidator的类中重写Validate,但您想实现什么?为什么您希望验证是有条件的,由其他验证的结果决定,每次只验证所有内容。@BenRobinson,因为我向用户显示一条消息说“车辆vin无效”,这没有意义。当我需要喝啤酒的时候