(流利)在包含子模型的模型中进行验证
(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
对象,尽管它包含单个上下文中的所有验证。
在我们当前的 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
对象,尽管它包含单个上下文中的所有验证。