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()); } }