Я пытаюсь создать проверку для проверки адреса электронной почты в двух списках. адрес электронной почты не может быть дублирован в 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.");
Объяснение в ссылке ниже
{ ссылка }