这是我第一次尝试实现FluentValidation,因为我需要覆盖复杂的验证场景。未经验证的FluentValidation集合属性
我试图验证的类有大量的属性,复杂的对象和几个集合。
我没有麻烦来验证主类的属性,甚至检查集合是否为空,但是在验证每个集合中的对象属性时遇到问题。
要实现这一点,我跟着这里记录的例子(下检查“集合校验重新使用”): http://fluentvalidation.codeplex.com/wikipage?title=creatingavalidator
这些是我的模型类(减少以提高可读性)
public class Caso
{
public int Id { get; set; }
public string Descripcion { get; set; }
public List<Medicamento> Medicamentos { get; set; }
}
public class Medicamento
{
public int Id { get; set; }
public string Nombre { get; set; }
}
这些是验证程序类:
public class CasoValidator : AbstractValidator<CasoAdverso>
{
public CasoValidator()
{
RuleSet("Iniciar",() =>
{
// Validated OK
RuleFor(x => x.Descripcion).NotEmpty();
// Validated OK
RuleFor(x => x.Medicamentos).Must(x => x != null && x.Count > 0).WithMessage("No puede iniciar un caso sin medicamentos cargados");
RuleFor(x => x.Medicamentos).SetCollectionValidator(new MedicamentoValidator());
});
}
}
public class MedicamentoValidator : AbstractValidator<Medicamento>
{
public MedicamentoValidator()
{
// NOT Validated. Even if the object property is empty the error message doesn't appear. I also checked using "NotNull" and "NotEmpty" clauses
RuleFor(x => x.Nombre).NotNull().WithMessage("Debe especificar un nombre");
}
}
(注意:我使用RuleSet是因为不同的验证策略作为依赖于工作流中的文档状态)
我从控制器手动执行验证(无MVC集成)
[HttpPost]
public ActionResult Iniciar(Caso c)
{
CasoValidator validator = new CasoValidator();
FluentValidation.Results.ValidationResult validate = validator.Validate(c, ruleSet: "Iniciar");
// ...
}
随着主类的这种实现性能进行验证罚款我还需要验证集合中“Medicamento”类的每个属性。
我能在这里错过什么吗?是否应该使用RuleForEach子句进行验证?
任何帮助将不胜感激。
非常感谢您的快速回复。我已经完成了你的建议调整,现在工作正常。 – Javier 2015-04-01 00:47:18