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

問題は、戻りエラーに「Email.Email」または「EmailAddress.Email」のエラー PropertyName があることです。「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 に答える