2

我正在使用流利的验证,并且我已经将一些常见的电子邮件地址验证规则提取到自定义电子邮件验证器中,例如。

public class CustomeEmailValidator  : AbstractValidator<string>
{
    public CustomeEmailValidator (string fieldName)
    {
        RuleFor(m => m).NotEmpty().WithMessage(EmailEmptyMsg).WithName(fieldName);
        RuleFor(m => m).EmailAddress().When(x => !string.IsNullOrEmpty(x)).WithMessage(EmailInvalidMsg).WithName(fieldName);
        RuleFor(m => m).Must(x => x.Length <= 94).When(x => !string.IsNullOrEmpty(x)).WithMessage(EmailLengthMsg).WithName(fieldName);
    }
}

然后在其他其他验证器中调用它

public class LoginModelValidator : AbstractValidator<LoginModel>
{
    public LoginModelValidator()
    {
        RuleFor(m => m.Password).NotEmpty().WithMessage(EmptyPasswordMsg);
        RuleFor(m => m.Email).SetValidator(new MediGapEmailValidator("Email"));
    }
}

问题是返回错误有一个错误PropertyName of 'Email.Email' 或EmailAddress.Email 我需要它只是'Email' 或者只是一个不带点的属性名称。

我在调用 setValidator 时尝试过 OverridePropertyName

RuleFor(m => m.Email).SetValidator(new MediGapEmailValidator("Email")).OverridePropertyName("Email");

但这似乎不起作用。

有没有更好的方法来分解这个常见的验证码?

4

1 回答 1

0

也许尝试另一种方法并使用扩展方法而不是自定义验证器。像这样:

public static class ValidationExtensions
{
    public static void ValidateEmail<TV>(this AbstractValidator<TV> validator, Expression<Func<TV, string>> property)
    {
        validator.RuleFor(property).NotEmpty().WithMessage(EmailEmptyMsg);
        // other rules go here...
    }
}

然后,您可以从任何验证器中调用它:

public class UserValidator : AbstractValidator<User>
{
    public UserValidator()
    {
        this.ValidateEmail(x => x.PrimaryEmail);
        this.ValidateEmail(x => x.SecondaryEmail);
    }
}
于 2012-12-24T08:49:50.653 回答