2012-10-23 23 views
2

我正在使用流利的驗證,我已經提取了一些通用的驗證規則的電子郵件地址到一個自定義的電子郵件驗證程序,例如。我如何擺脫一個流暢的ValidationResult PropertyName中的點

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

的問題,請致電這是返回錯誤有一個錯誤「Email.Email」的屬性名或EmailAddress.Email,我需要它只是'電子郵件'或只是一個單一的屬性名稱。

我調用setValidator將

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

當試圖OverridePropertyName但它似乎並沒有工作。

有沒有更好的方法來分解出這個常見的驗證碼?

回答

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