我有以下验证器类:
public class FranchiseInfoValidator : AbstractValidator<FranchiseInfo>
{
public FranchiseInfoValidator()
{
RuleFor(franchiseInfo => franchiseInfo.FolderName).NotEmpty().Matches("^[a-zA-Z0-9_.:-]+$").WithMessage("Invalid characters");
RuleFor(franchiseInfo => franchiseInfo.ExeIconName).NotEmpty().Matches("^[a-zA-Z0-9_.:-]+$").WithMessage("Invalid characters");
RuleFor(franchiseInfo => franchiseInfo.FullName).NotEmpty().Matches("^[a-zA-Z0-9_.:-]+$").WithMessage("Invalid characters");
RuleFor(franchiseInfo => franchiseInfo.ShortName).NotEmpty().Matches("^[a-zA-Z0-9_.:-]+$").WithMessage("Invalid characters");
}
具有自定义消息的 NotEmpty()
和Matches("^[a-zA-Z0-9_.:-]+$").WithMessage("Invalid characters")
验证程序对于所有属性都是相同的。是否可以将它们组合在一个自定义验证器中,然后编写如下内容:
RuleFor(franchiseInfo => franchiseInfo.FolderName).SetValidator(new CustomValidator());
我已经完成了一些自定义验证器,但在这种情况下没有。这可能吗?我在文档中找不到这样的例子。此外,我想知道这是否可能是通用的,所以如果我有另一个带有属性的验证器类来应用相同的自定义验证器?感谢。
答案 0 :(得分:3)
public class MyCustomValidator : PropertyValidator
{
public MyCustomValidator()
: base("Property {PropertyName} has invalid characters.")
{
}
protected override bool IsValid(PropertyValidatorContext context)
{
var element = context.PropertyValue as string;
return !string.IsNullOrEmpty(element) && Regex.IsMatch(element, "^[a-zA-Z0-9_.:-]+$");
}
}
用法: 使用您的代码,或创建自己的扩展
public static class MyValidatorExtensions {
public static IRuleBuilderOptions<T, string> CheckIfNullAndMatches<T>(this IRuleBuilder<T, string> ruleBuilder) {
return ruleBuilder.SetValidator(new MyCustomValidator<TElement>());
}
}
然后使用
RuleFor(franchiseInfo => franchiseInfo.FolderName).CheckIfNullAndMatches();
如果您需要更通用的验证器,您还可以将正则表达式作为参数...
doc here