Как вернуть строку, которая не прошла регулярное выражение с RegularExpressionAttribute - PullRequest
0 голосов
/ 25 марта 2019

Я написал регулярное выражение, которое работает, и я возвращаю сообщение ErrorMessage для просмотра пользователем.В моем случае я проверяю массив строк (электронных писем), и я хочу, чтобы пользователь знал, какое поле не удалось, а не просто общее сообщение.Есть ли способ вернуть строку, которая потерпела неудачу?

Я мог бы написать свою собственную систему обработки регулярных выражений, которая бы перебирала строки и возвращала те, которые не соответствовали регулярному выражению.Хотя это немного не так, поскольку .net дает мне возможность выполнять регулярные выражения в моих моделях.

Возможно, я ошибся в функциональности регулярного выражения модели, если это не удастся.это терпит неудачу.И я могу просто знать, какая модель не удалась, а не какой конкретный объект.

Я просмотрел документацию по: https://docs.microsoft.com/en-us/dotnet/api/system.componentmodel.dataannotations.regularexpressionattribute?view=netframework-4.7.2

Однако я не могу найти никакой опции для возврата объекта.Но, возможно, упустил это из виду.

    [Display(Name = "Admin Emails")]

    [RegularExpression(@"[a-z0-9!#$%&' * +/=?^ _`{|}~-]+(?:\.[a-z0- 
    9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0- 
    9](?:[a-z0-9-]*[a-z0-9])?",

    ErrorMessage = "Admin needs a valid email")]

    public List<string> AdminEmails { get; set; }

и мой контроллер просто проверяет модель

        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

, и я хочу, чтобы сообщение об ошибке возвращало что-то вроде "admin @ admin должно бытьдействительный адрес электронной почты "

1 Ответ

0 голосов
/ 25 марта 2019

Что если мы создадим пользовательский атрибут, выполнив следующее:

 public class EmailsCustomAttribute : ValidationAttribute
    {
        public EmailsCustomAttribute(string pattern)
        {
            this.Pattern = pattern;
        }

        public string Pattern { get; }

        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            Regex regex = new Regex(Pattern);
            List<string> emails = value as List<string>;
            string errorMessage = string.Empty;
            foreach (var item in emails)
            {
                if (!regex.IsMatch(item))
                {
                    errorMessage += this.ErrorMessage.Replace("{0}", item);
                }
            }
            ValidationResult validationResult = new ValidationResult(errorMessage);

            return validationResult;
        }
    }

и используйте его следующим образом:

public class TestModel
    {
        [EmailsCustom(@"[a-z0-9!#$%&' * +/=?^ _`{|}~-]+(?:\.[a-z0- 
    9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0- 
    9](?:[a-z0-9-]*[a-z0-9])?", ErrorMessage = "{0} is invalid email")]
        public List<string> Emails { get; set; }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...