c# - FluentValidation:在子集合规则中使用父属性值

标签 c# fluentvalidation

我有这个验证器:

 public class InputValidator : AbstractValidator<InputData>
{
    public InputValidator()
    { 
        RuleFor(inputData => inputData.Ucl).GreaterThan(0).....;

        RuleForEach(inputData => inputData.Loads).ChildRules(inputData => {            
              inputData.RuleFor(load => load.Position).GreaterThan(0).....); 
            });
... etc

但是:位置(在每次加载中)也必须小于 Ucl(在 InputData 中)。
如何为这种关系制定规则(父参数与子参数)?

最佳答案

我不认为有一个很好的方法可以内联。子规则不允许您传入父对象。 Must我认为 Custom (通过 context.ParentContext.InstanceToValidate 也许)将允许您添加涉及父项和子项的规则,但规则将针对集合而不是每个项目。更好的方法,以及我通常的做法是为您的 Load 创建一个子验证器。实体:

public class LoadValidator : AbstractValidator<Load>
{
    public LoadValidator(InputData inputData)
    {
        RuleFor(load => load.Position)
                .GreaterThan(0).WithMessage("Position must be greater than 0")
                .LessThan(inputData.Ucl).WithMessage("Position must be less than Ucl");     
    }
}

这变得可重用并且更容易测试。然后使用 SetValidator使用它。
public class InputDataValidator : AbstractValidator<InputData>
{
    public InputDataValidator()
    {
        RuleFor(inputData => inputData.Ucl)
            .GreaterThan(0).WithMessage("Ucl must be greater than 0");

        RuleForEach(inputData => inputData.Loads)
            .SetValidator(inputData => new LoadValidator(inputData));
    }
}

Reusable property validators可能是另一种方式,但对我来说,它必须是一个相当高级别/通用的案例才能实现一个。

关于c# - FluentValidation:在子集合规则中使用父属性值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61550275/

相关文章:

c# - Registry.GetValue() 和 Registry.User.GetValue() 的不同结果

c# - 表单不显示控件,它显示一个空表单

c# - 自定义流利验证器

c# - 如何通过验证和可选的请求上下文直接从 C# 代码调用 servicestack 服务

c# - 有没有可能在 #windows 应用程序中嵌入 word 文档?

c# - 使用 C# Vector<T> SIMD 查找匹配元素的索引

servicestack - 在 ServiceStack 的元数据页面中反射(reflect) AbstractValidator 规则

c# - 检查参数是否是具有流畅验证的 3 个值之一

asp.net-mvc - 如何防止 Fluent Validation 在特定条件下验证模型

c# - 使用 XAML 数据绑定(bind)将 Line 的每一端绑定(bind)到 Canvas 上两个形状的中心