在我们当前的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)的控件显示存在错误。
它会更新以显示子模型的属性更改后出现错误。
答案 0 :(得分:1)
在父级上,您应该循环子模型并手动验证它们。 Catel无法自动进行分层验证并通过<td>{{ count($project->projectTemplate) }}</td>
接口公开。
您可以创建一个IDataErrorInfo
对象,但该对象包含单个上下文中的所有验证。