如何在FluentValidator中验证子项名称存在于父类有效名称列表?
解决方法
要在验证子对象Child时访问父模型ValidationModel的ValidNames集合,你可以用FluentValidation提供的两种方式实现需求:
方式一:利用Must的重载方法
Must有支持父对象参数的重载版本,直接在验证规则里拿到父模型实例,然后检查名称是否在有效列表中:
public class MyValidator : AbstractValidator<ValidationModel> { public MyValidator() { RuleForEach(model => model.Children).ChildRules(childRules => { childRules.RuleFor(child => child.Name) .Must((parentModel, name) => parentModel.ValidNames?.Contains(name) == true) .WithMessage("名称 {PropertyValue} 不在有效列表中"); }); } }
这里第一个参数parentModel就是当前的ValidationModel实例,直接调用它的ValidNames.Contains就能完成检查。加?.是为了避免ValidNames为null时触发空引用异常。
方式二:通过ParentContext获取父模型
如果需要在验证逻辑里多次操作父模型,也可以通过子验证器的ParentContext属性拿到父模型:
public class MyValidator : AbstractValidator<ValidationModel> { public MyValidator() { RuleForEach(model => model.Children).ChildRules(childRules => { childRules.RuleFor(child => child.Name) .Must(name => { var parentModel = (ValidationModel)childRules.ParentContext.InstanceToValidate; return parentModel.ValidNames?.Contains(name) == true; }) .WithMessage("名称 {PropertyValue} 不在有效列表中"); }); } }
注意这里需要把InstanceToValidate强制转换成ValidationModel类型,确保类型安全。
额外提示
- 务必处理
ValidNames为null的情况,否则当父模型的这个集合未初始化时会报错。 - 用
WithMessage自定义错误信息,能让问题定位更直观,比如显示当前无效的名称。
内容的提问来源于stack exchange,提问作者Mark D
相关产品推荐
相关产品推荐

