我正在使用 FluentValidation

我想使用以下方法进行范围验证:

InclusiveBetween

  RuleFor(x => x.Height)
             .InclusiveBetween(x=> x.min, x.max).

我希望能够从模型动态获取 'from' 和 'to' 值......而不是在验证器中进行硬编码

这可能吗?

谢谢

最佳答案

好吧,在 FluentValidation 中没有任何内容。

但是你可以编写你自己的扩展方法(和验证器),类似的东西(快速拍摄,所以你必须把它做得更好,但你有想法)。

//the extension method
public static class ValidationExtensions
   {
        public static IRuleBuilder<T, TProperty> InclusiveBetween<T, TProperty>(this IRuleBuilder<T, TProperty> ruleBuilder, Expression<Func<T, TProperty>> fromExpression, Expression<Func<T, TProperty>> toExpression)
        {
           var fromFunc = leftExpression.Compile();
           var toFunc = rightExpression.Compile();
           return ruleBuilder.SetValidator(new InclusiveBetweenPropertyValidator(fromFunc.CoerceToNonGeneric(), fromExpression.GetMember(), toFunc.CoerceToNonGeneric(), toExpression.GetMember()));
        }
   }

然后是 Validator 类
public class InclusiveBetweenPropertyValidator : PropertyValidator, IBetweenValidator, IPropertyValidator
{
    public  Func<object, object> FromFunc { get; set; }
    public MemberInfo FromMemberInfo { get; set; }

    public Func<object, object> ToFunc { get; set; }
    public MemberInfo ToMemberInfo { get; set; }

    public IComparable From { get; private set; }
    public IComparable To { get; private set; }

    public InclusiveBetweenPropertyValidator(Func<object, object> fromFunc, MemberInfo fromMember, Func<object, object> toFunc, MemberInfo toMember)
        : base((() => Messages.inclusivebetween_error))
    {
        FromFunc = fromFunc;
        FromMemberInfo = fromMember;
        ToFunc = toFunc;
        ToMemberInfo = toMember;
    }


    protected override bool IsValid(PropertyValidatorContext context)
    {
        var comparable = (IComparable)context.PropertyValue;
        From = (IComparable)this.FromFunc(context.Instance);
        To = (IComparable)this.ToFunc(context.Instance);

        if (comparable == null || FluentValidation.Internal.Comparer.GetComparisonResult(comparable, From) >= 0 && FluentValidation.Internal.Comparer.GetComparisonResult(comparable, To) <= 0)
            return true;
        context.MessageFormatter.AppendArgument("From", string.Format("{0} ({1})", FromMemberInfo.Name, From)).AppendArgument("To", string.Format("{0} ({1})",ToMemberInfo.Name, To)).AppendArgument("Value", context.PropertyValue);
        return false;
    }
}

用法 :
RuleFor(x => x.Height)
             .InclusiveBetween(x=> x.min, x.max)

关于model-view-controller - fluentvalidation InclusiveBetween 动态设置范围,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23938127/

10-14 14:19