(流畅)包含子模型的模型中的验证

时间:2016-08-31 13:13:49

标签: catel

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

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

e.g。 型号:

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)的控件显示存在错误。

InfoBarMessageControlFault

它会更新以显示子模型的属性更改后出现错误。

1 个答案:

答案 0 :(得分:1)

在父级上,您应该循环子模型并手动验证它们。 Catel无法自动进行分层验证并通过<td>{{ count($project->projectTemplate) }}</td> 接口公开。

您可以创建一个IDataErrorInfo对象,但该对象包含单个上下文中的所有验证。