嵌套验证器只能与成员表达式

时间:2016-12-14 18:22:17

标签: validation member fluent

我正在尝试使用流畅的验证。 希望针对IList项目运行验证。

  public class ProgramDetailsValidatorForBulkEdit : ValidatorCollection<IList<ProgramDTO>>
{

    public ProgramDetailsValidatorForBulkEdit()
    {
        RuleFor(x => x).Cascade(CascadeMode.StopOnFirstFailure).SetCollectionValidator(new ProgramDetailsValidator1());

    }
}
public class ProgramDetailsValidator1 : AbstractValidator<ProgramDTO>
{
    public ProgramDetailsValidator1()
    {
        RuleFor(c => c.Capacity).NotNull()
            .WithMessage(String.Format(AppConstants.ValidationTemplates.RequiredField, "Capacity"));

    }
}

调用该行时返回的错误是“嵌套验证程序只能与成员表达式一起使用。”

RuleFor(x => x).Cascade(CascadeMode.StopOnFirstFailure).SetCollectionValidator(new ProgramDetailsValidator1());

1 个答案:

答案 0 :(得分:0)

错误原因

错误消息包含单词“ Member Expressions”。问题出在RuleFor(x => x)中。嵌套验证器只能与选择x的某些成员的lambda一起使用,例如,与x => x.MySubobject1一起使用。 Lambda x => x未选择x的任何成员。

要验证集合

创建包含列表的对象:

public class MyObject
{
    public List<Item> Items { get; set; }
}

您可以使用泛型为所有列表创建1个通用对象和验证器。

public class MyObjectValidator : AbstractValidator<MyObject>
{
    public MyObjectValidator()
    {
        RuleFor(x => x.Items)  // will work, because it is not "x => x"
            .SetCollectionValidator(new ItemValidator());
    }
}

验证对象

使用指向成员的lambda来验证内部对象,并使用来自对象验证器的继承来验证根x

public class MySimpleObject { ... }

public class MyCompositeObject : MySimpleObject
{
    public MyType1 MySubobject1 { get; set; }
    public MyType2 MySubobject2 { get; set; }
}
public class MySimpleObjectValidator : AbstractValidator<MySimpleObject>
{
    public MySimpleObjectValidator()
    {
        ...
    }
}

public class MyCompositeObjectValidator : MySimpleObjectValidator 
{
    public MyCompositeObjectValidator () : base()  // Call base validator to implement rules for "x => x" written in MySimpleObjectValidator!
    {
        // Rules for SUBobjects will work
        RuleFor(x => x.MySubobject1)
                .SetValidator(new MyType1Validator())
                .WithName("Subobject1's errors group");

        RuleFor(x => x.MySubobject2)
                .SetValidator(new MyType2Validator())
                .WithName("Subobject2's errors group");
    }   
}