gpt4 book ai didi

model-view-controller - fluidvalidation InclusiveBetween 动态设置范围

转载 作者:行者123 更新时间:2023-12-03 01:26:39 28 4
gpt4 key购买 nike

我正在使用 FluentValidation

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

包容性

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

然后是验证器类

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 - fluidvalidation InclusiveBetween 动态设置范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23938127/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com