C# FluentValidation仅在值不为空时应用规则

C# FluentValidation仅在值不为空时应用规则,c#,fluentvalidation,C#,Fluentvalidation,对于FluentValidation,我有以下扩展方法: public static IRuleBuilderOptions<T, string> MustHasLengthBetween<T>(this IRuleBuilder<T, string> rule, int min, int max) { return rule .Length(min, max).WithMessage(someCusto

对于
FluentValidation
,我有以下扩展方法:

    public static IRuleBuilderOptions<T, string> MustHasLengthBetween<T>(this IRuleBuilder<T, string> rule, int min, int max)
    {
        return rule
            .Length(min, max).WithMessage(someCustomMessage);
    }

它是有效的,但是当调用每个调用方法时,我必须将这个
。当
调用扩展方法时,是否有方法移动

当下面的
生成器允许您访问属性值时,添加扩展
。您也可以将其与其他验证一起重复使用

public static IRuleBuilderOptions When(此IRuleBuilderOptions规则,Func谓词,ApplyConditionTo ApplyConditionTo=ApplyConditionTo.AllValidators)
{
返回规则。配置(配置=>{
config.ApplyCondition(ctx=>predicate((T)ctx.Instance,(TProperty)ctx.PropertyValue),applyConditionTo);
});
}
试验
公共类UnitTest1
{
[事实]
public void应验证长度()
{
var ok1=新模型{MyProperty=null};
var ok2=新模型{MyProperty=”“};
var ok3=新模型{MyProperty=“55555”};
var fail=新模型{MyProperty=“1”};
var v=新的ModelValidator();
v、 验证数据流(ok1);
v、 验证数据流(ok2);
v、 验证数据流(ok3);
应该抛出(()=>v.ValidateAndThrow(fail));
}
公共类模型
{
公共字符串MyProperty{get;set;}
}
公共类ModelValidator:AbstractValidator
{
公共模型验证器()
{
RuleFor(x=>x.MyProperty)
.长度必须介于(5,10)之间;
}
}
}
公共静态类扩展
{
公共静态IRuleBuilder选项必须具有LengthBetween(此IRuleBuilder规则,int-min,int-max)
{
返回规则
.长度(最小值、最大值)。带消息(“AGAGA”)
.When((model,prop)=>!string.IsNullOrEmpty(prop));
}
/// 
///谓词生成器,使已验证的属性可用
/// 
/// 
/// 
/// 
/// 
/// 
/// 
/// 
公共静态IRuleBuilderOptions When(此IRuleBuilderOptions规则,Func谓词,ApplyConditionTo ApplyConditionTo=ApplyConditionTo.AllValidators)
{
返回规则。配置(配置=>
{
config.ApplyCondition(ctx=>predicate((T)ctx.Instance,(TProperty)ctx.PropertyValue),applyConditionTo);
});
}
}
公共静态IRuleBuilderInitial MustHasLengthBetween(此IRuleBuilder规则,int min,int max)
{
返回规则.自定义((对象,上下文)=>
{
如果(!String.IsNullOrEmpty(obj)&&(obj.Lengthmax))
{
AddFailure(“自定义消息”);
}
});
}
        RuleFor(a => a.SomeProperty)
            .MustHasLengthBetween(5, 10)
            .When(x => !String.IsNullOrEmpty(x.SomeProperty))
public static IRuleBuilderInitial<T, string> MustHasLengthBetween<T>(this IRuleBuilder<T, string> rule, int min, int max)
        {
            return rule.Custom((obj, context) =>
            {
                if (!String.IsNullOrEmpty(obj) && (obj.Length < min || obj.Length > max))
                {
                    context.AddFailure("custom message");
                }
            });
        }