Fluent Validation,Asp.NET Core 中列表中每个项目的不同验证
Fluent Validation, different validation for each item in a list in Asp.NET Core
我一直在努力寻找一种方法来验证列表中的项目,每个项目都有不同的验证规则。我遇到了 Fluent validation,这是一个很棒的库,但我似乎无法找到一种方法来单独对每个项目进行验证。我从这个类似的帖子中得到了一个模糊的想法 (Validate 2 list using fluent validation),但我不确定如何按照我想要的方式关注它。
所以我有这个视图模型:
public class EditPersonalInfoViewModel
{
public IList<Property> UserPropertyList { get; set; }
}
这包含一个 Active Directory 属性列表。每个代表这个 class:
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<EditPersonalInfoViewModel>
{
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
}
}
)
}
}
有什么办法解决这个问题吗?提前致谢。
您从错误的角度进行验证。不要在你的收集容器 class 中创建验证条件,只需创建另一个特定于你的 Property
class 的验证器,然后在你的 ADPropertiesValidator
:
中使用它
public class ADPropertyValidator : AbstractValidator<Property>
{
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<EditPersonalInfoViewModel>
{
public ADPropertiesValidator()
{
RuleForEach(vm => vm.UserPropertyList)
.SetValidator(new ADPropertyValidator());
}
}
我一直在努力寻找一种方法来验证列表中的项目,每个项目都有不同的验证规则。我遇到了 Fluent validation,这是一个很棒的库,但我似乎无法找到一种方法来单独对每个项目进行验证。我从这个类似的帖子中得到了一个模糊的想法 (Validate 2 list using fluent validation),但我不确定如何按照我想要的方式关注它。
所以我有这个视图模型:
public class EditPersonalInfoViewModel
{
public IList<Property> UserPropertyList { get; set; }
}
这包含一个 Active Directory 属性列表。每个代表这个 class:
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<EditPersonalInfoViewModel>
{
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
}
}
)
}
}
有什么办法解决这个问题吗?提前致谢。
您从错误的角度进行验证。不要在你的收集容器 class 中创建验证条件,只需创建另一个特定于你的 Property
class 的验证器,然后在你的 ADPropertiesValidator
:
public class ADPropertyValidator : AbstractValidator<Property>
{
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<EditPersonalInfoViewModel>
{
public ADPropertiesValidator()
{
RuleForEach(vm => vm.UserPropertyList)
.SetValidator(new ADPropertyValidator());
}
}