【发布时间】:2015-10-29 19:54:35
【问题描述】:
我有一个 MVC 应用程序,每个视图模型有很多 AbstractValidator<T>。这是设计使然,因为我使用SimpleInjector 来注入查询以访问我们的数据库,并且我不想在一个验证器中让构造函数过度注入。我创建了下面的类,它是每个视图模型的验证器,但它不调用我的When 和其他自定义验证规则,只调用简单规则。任何帮助将不胜感激。谢谢你。
public class CompositeValidator<T> : AbstractValidator<T>
{
private ICollection<IValidator> _validators = new List<IValidator>();
public CompositeValidator(IEnumerable<IValidator<T>> validators = null)
{
if (validators == null) return;
foreach (var validator in validators)
{
_validators.Add(validator);
var enumerator = validator.GetEnumerator();
while (enumerator.MoveNext())
{
AddRule(enumerator.Current);
}
}
}
public override ValidationResult Validate(ValidationContext<T> context)
{
var errorsFromOtherValidators = _validators.SelectMany(x => x.Validate(context).Errors);
return new ValidationResult(errorsFromOtherValidators );
}
}
这是两个验证器的示例
public class PersonValidator : AbstractValidator<PersonVm>
{
public PersonValidator()
{
RuleFor(model => model.FirstName).NotEmpty();
RuleFor(model => model.LastName).NotEmpty();
}
}
public class PersonMustBeRegisteredValidator : AbstractValidator<PersonVm>
{
private readonly IQuery<PersonExists> _query;
public PersonMustBeRegisteredValidator(IQuery<ReturnPerson> query)
{
_query = query;
Custom(model =>
{
var person = _query.Select(new { model.Id });
if (person == null) return new ValidationFailure("Id", "Person does not exist");
return null;
});
}
}}
【问题讨论】:
标签: c# asp.net-mvc validation fluentvalidation