如何摆脱流畅的ValidationResult的PropertyName中的点

时间:2012-10-23 06:43:49

标签: c# fluentvalidation

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

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为'Email.Email'或EmailAddress.Email,我需要它只是'电子邮件'或只是一个没有点的属性名称。

我在调用setValidator

时尝试过OverridePropertyName
RuleFor(m => m.Email).SetValidator(new MediGapEmailValidator("Email")).OverridePropertyName("Email");

但它似乎不起作用。

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

1 个答案:

答案 0 :(得分: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);
    }
}