Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 基于Fluent验证的链接规则_C#_Fluent_Fluentvalidation - Fatal编程技术网

C# 基于Fluent验证的链接规则

C# 基于Fluent验证的链接规则,c#,fluent,fluentvalidation,C#,Fluent,Fluentvalidation,我已经在使用Fluent验证的最新版本,即5.4.0.0;我需要实现的是: 考虑车辆VIN,这取决于制造商Id、型号Id和制造年份。在Fluent中,当成功执行规则时,我是否能够基于更多规则执行规则 如果三条规则(品牌、型号和年份)都通过,我必须验证车辆vin 我也阅读了整个文档,找不到任何实现它的参考 class VehicleValidator : AbstractValidator<Vehicle> { public VehicleValidator() {

我已经在使用Fluent验证的最新版本,即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));
    }
}
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无效”,这没有意义。当我需要喝啤酒的时候