Fluentvalidation,Asp.NET Core列表中每个项目的不同validation

我一直试图找到一种方法来validation列表中的项目,每个项目都有不同的validation规则。 我发现了Fluentvalidation,这是一个很棒的库,但我似乎无法找到一种方法来单独对每个项目进行validation。 我从这个类似的线程( 使用流畅的validationvalidation2列表 )得到了一个微弱的想法,但我不知道如何关注它我想要的方式。

所以我有这个视图模型:

public class EditPersonalInfoViewModel { public IList UserPropertyList { get; set; } } 

其中包含Active Directory属性列表。 每个由这个类代表:

  public class Property { public string Name { get; set; } public UserProperties Value { get; set; } public string input { get; set; } public bool Unmodifiable { get; set; } public string Type { get; set; } } 

关键是,每个AD属性都有不同的约束,所以我想以某种方式为列表中的每个属性指定不同的规则:

  public class ADPropertiesValidator : AbstractValidator { public ADPropertiesValidator() { RuleFor(p => p.UserPropetyList).Must((p,n) => { for (int i = 0; i < n.Count; i++) { if ((n[i].Name.Equals("sAMAccountName")) { RuleFor(n.input ).NotEmpty().... } else if(...) { //More Rules } } ) } } 

任何想法如何处理这个? 提前致谢。

您正在从错误的角度接近validation。 不要在集合容器类中创建validation条件,只需创建另一个特定于Property类的validation器,然后在ADPropertiesValidator使用它:

 public class ADPropertyValidator : AbstractValidator { public ADPropertyValidator() { When(p => p.Name.Equals("sAMAccountName"), () => { RuleFor(p => p.input) .NotEmpty() .MyOtherValidationRule(); }); When(p => p.Name.Equals("anotherName"), () => { RuleFor(p => p.input) .NotEmpty() .HereItIsAnotherValidationRule(); }); } } public class ADPropertiesValidator : AbstractValidator { public ADPropertiesValidator() { RuleForEach(vm => vm.UserPropertyList) .SetValidator(new ADPropertyValidator()); } }