(流利)在包含子模型的模型中进行验证

(Fluent)Validation in models that contain child models

在我们当前的 catel 应用程序中,我们有一个 ModelBase class,它有一个成员是另一个 ModelBase。

我们想使用 fluentvalidation 扩展来为两个模型编写验证规则。

例如 型号:

public class Model : ModelBase
{
    public Model()
    {
        ChildModel = new ChildModel();
    }

    public string FirstName
    {
        get { return GetValue<string>(FirstNameProperty); }
        set { SetValue(FirstNameProperty, value); }
    }

    public static readonly PropertyData FirstNameProperty = RegisterProperty("FirstName", typeof(string), string.Empty);

    public ChildModel ChildModel
    {
        get { return GetValue<ChildModel>(ChildModelProperty); }
        set { SetValue(ChildModelProperty, value); }
    }

    public static readonly PropertyData ChildModelProperty = RegisterProperty("ChildModel", typeof(ChildModel), null);
}

public class ChildModel : ModelBase
{
    public static readonly PropertyData TestStringProperty = RegisterProperty("TestString", typeof(string), null);

    public string TestString
    {
        get { return GetValue<string>(TestStringProperty); }
        set { SetValue(TestStringProperty, value); }
    }
}

验证者:

public class PersonValidator : AbstractValidator<ModelWithoutValidation>
{
    public PersonValidator()
    {
        RuleFor(model => model.FirstName)
            .NotNull()
            .NotEmpty();

        RuleFor(model => model.MiddleName)
            .NotNull()
            .NotEmpty();

        RuleFor(model => model.LastName)
            .NotNull()
            .NotEmpty()
            .WithMessage("Last name cannot be empty");

        //this doesnt work, so we use a second validator for the ChildModel
        //RuleFor(model => model.ChildModel.TestString)
        //    .NotNull()
        //    .Length(2, 10)
        //    .When(model => model.ChildModel != null);
    }
}

public class ChildValidator : AbstractValidator<ChildModel>
{
    public ChildValidator()
    {
        RuleFor(model => model.TestString)
            .NotNull()
            .NotEmpty()
            .Length(2, 10);
    }
}

父模型只有在其所有子模型都有效时才有效,有没有办法做到这一点?

此外,InfoBarMessageControl 仅显示父控件中父属性的错误,即使绑定到子模型的控件 属性 (TestString) 显示存在错误。

更新显示子模型属性变化后出现错误

在父级上,您应该循环您的子模型并手动验证它们。 Catel 无法自动进行分层验证并通过 IDataErrorInfo 接口公开它。

您可以创建一个 IValidationContext 对象,尽管它包含单个上下文中的所有验证。