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");
}
});
}