FluentValidation - проверка строк внутри списка - PullRequest
0 голосов
/ 22 января 2020

Я пытаюсь создать проверку для проверки адреса электронной почты в двух списках. адрес электронной почты не может быть дублирован в CcList и в BccList.

У меня есть эта модель:

public class EmailEnforceListingGroup : EnforceListingGroup
{
    public string TemplateId { get; set; }

    public string ToEmail { get; set; }

    public string Subject { get; set; }

    public string Body { get; set; }

    public string CcEmail { get; set; }

    public string BccEmail { get; set; }

    public IList<EnforceFileAttachment> Attachments { get; set; }

    public IList<string> CcEmailList => !CcEmail.IsNullOrEmpty() ? CcEmail.Split(',', ';').ToList() : new List<string>();

    public IList<string> BccEmailList => !BccEmail.IsNullOrEmpty() ? BccEmail.Split(',', ';').ToList() : new List<string>();

    public EmailEnforceListingGroup()
    {
        Attachments = new List<EnforceFileAttachment>();
    }
}

И я создал этот валидатор:

public class EmailEnforceListingGroupValidator : AbstractValidator<EmailEnforceListingGroup>
{
    public EmailEnforceListingGroupValidator()
    {
        RuleFor(x => x.TemplateId)
            .NotEmpty();

        RuleFor(x => x.ToEmail)
            .NotEmpty()
            .EmailAddress();

        RuleFor(x => x.Subject)
            .NotEmpty();

        RuleFor(x => x.Body)
            .NotEmpty();

        RuleForEach(x => x.CcEmailList)
            .EmailAddress();

        RuleForEach(x => x.BccEmailList)
            .EmailAddress();

        RuleFor(x => x)
            .Must(emailEnforce => !IsDuplicated(emailEnforce.ToEmail, emailEnforce.CcEmailList.ToList()))
            .WithMessage("The field [Cc] contains an Email Address that already exists in the [To] field.");

        RuleFor(x => x)
            .Must(emailEnforce => !IsDuplicated(emailEnforce.ToEmail, emailEnforce.BccEmailList.ToList()))
            .WithMessage("The field [Bcc] contains an Email Address that already exists in the [To] field.");

        RuleFor(emailEnforce =>
            RuleForEach(eachEmail => eachEmail.CcEmailList)
                .Must(email => !IsDuplicated(email, emailEnforce.BccEmailList.ToList()))
                .WithMessage("The field [Bcc] contains an Email Address that already exists in the [Cc] field."));
    }

    private bool IsDuplicated(string email, List<string> listToCheck)
    {
        return listToCheck.Any(x => x.Equals(email));
    }
}

Использование RuleForEach и SetValidator для нового пользовательского валидатора - это возможный способ, но я не знаю, как отправить BccList вместе каждому CcEmail, чтобы увидеть, существует ли он в другом списке.

Две проверки с использованием RuleFor и Must: работает нормально, но валидатор, использующий RuleFor, RuleForEach и Must, не обнаруживает никаких ошибок.

РЕДАКТИРОВАНИЕ:

Я решил проблему, используя этот подход

RuleForEach(emailEnforce => emailEnforce.CcEmailList)
            .Must((emailEnforce, email) => !IsDuplicated(email, emailEnforce.BccEmailList.ToList()))
            .WithMessage(
                "The field [Bcc] contains an Email Address ({PropertyValue}) that already exists in the [Cc] field.");

Объяснение в ссылке ниже

{ ссылка }

1 Ответ

0 голосов
/ 22 января 2020

У меня не было возможности протестировать этот код, но он должен быть примерно таким. Если вы посмотрите на страницу FV Custom Validators (https://fluentvalidation.net/custom-validators), вы увидите, что вы можете получить доступ к объекту root в вашей пользовательской функции, таким образом, первый параметр моего BeUniqueEmail () - это root объект, а затем вы можете получить доступ к любому другому свойству через модель. Таким образом, вы можете получить доступ к своему BccList, и сравнить его легко. Параметр строки электронной почты - это просто каждое электронное письмо в CcEmailList, полученное из RuleForEach. Не должно быть никаких причин вкладывать RuleForEach в RuleFor.

RuleForEach(x => x.CcEmailList )
    .BeUniqueEmail()
    .WithMessage("The field [Bcc] contains an Email Address that already exists in the [Cc] field.");


private bool BeUniqueEmail(EmailEnforceListingGroup model, string email)
{
    return model.BccEmailList.Any(x => x.Equals(email));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...