Проверка адреса электронной почты с использованием атрибутов типа данных ASP.NET MVC

163

У меня есть некоторые проблемы с проверкой электронной почты.

В моей модели:

[Required(ErrorMessage = "Field can't be empty")]
[DataType(DataType.EmailAddress, ErrorMessage = "E-mail is not valid")]
public string ReceiverMail { get; set; }

На мой взгляд:

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

@Html.TextBoxFor(m => m.ReceiverMail, new { @placeholder="E-mail"}) <br />
@Html.ValidationMessageFor(m => m.ReceiverMail)

Теперь он правильно показывает мне «Поле не может быть пустым», когда вы оставляете поле пустым. Но когда вы вводите неправильный адрес электронной почты, например: «fwenrjfw», то в форме не появляется «E-mail is not valid».

Как я могу получить форму для подтверждения ввода в качестве адреса электронной почты? Я ищу некоторую помощь с этим.

Ява Афка
источник

Ответы:

328

Если вы используете .NET Framework 4.5, решение заключается в использовании, EmailAddressAttributeкоторое находится внутри System.ComponentModel.DataAnnotations.

Ваш код должен выглядеть примерно так:

[Display(Name = "Email address")]
[Required(ErrorMessage = "The email address is required")]
[EmailAddress(ErrorMessage = "Invalid Email Address")]
public string Email { get; set; }
Ситту Джозеф Олугбенга
источник
Спасибо @Shittu Olugbenga! Но я не могу понять, почему это не работает:[DataType(DataType.EmailAddress, ErrorMessage = "Error message.")]
Веллингтон Занелли
15
@Wellington Zanelli - DataType (DataType.EmailAddress) нельзя использовать для проверки ввода пользователя. Он используется только для предоставления подсказки пользовательского интерфейса для рендеринга значений с использованием шаблонов отображения / редактирования.
Лиам
3
@Jni DataType.EmailAddressне о проверке. Речь идет о представлении данных ...
Себастьян Xawery Wiśniowiecki
3
У меня та же проблема, и для меня проверка электронной почты работает нормально, за исключением писем типа name @ xxx. Кто-нибудь еще видел это?
Кремена Лалова
3
@KremenaLalova name@xxx- это полностью действующий адрес электронной почты, поэтому с этим методом все в порядке. Рассмотрим пример username@localhostдля примера.
Джон Бергман
39

Попробуйте Html.EditorForвспомогательный метод вместо Html.TextBoxFor.

hazimdikenli
источник
1
Это правильный ответ, поскольку он будет использовать тип данных и ошибки, которые вы уже добавили в свою модель.
Рикардо Санчес
4
этот метод не проверяет домен tld, поэтому кто-то может ввести myname @ any и пропустить .com, и он будет проверен правильно
JasonH
8
myname @ независимо от того, что является действительным адресом электронной почты
michaelmsm89
Отлично сработало для mvc 4. Спасибо.
Хосе Гомес
Что написать в html.Editor для проверки электронной почты?
Neeraj Kumar
28

Вам нужно использовать атрибут RegularExpression, что-то вроде этого:

[RegularExpression("^[a-zA-Z0-9_\\.-]+@([a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,6}$", ErrorMessage = "E-mail is not valid")]

И не удаляйте [Обязательный], потому что [RegularExpression] не влияет на пустые поля.

Александр Имра
источник
8
Старая школа хороша, но поскольку Microsoft внедрила атрибут, она устраняет ошибки и упущения, которые могут возникнуть в определенных ситуациях, странах, часовых поясах или планетах. Поэтому лучше использовать полностью освобожденную базу кода, чем пользовательское регулярное выражение. Например, принимает ли ваше регулярное выражение новые домены верхнего уровня?
Петр Кула
2
Это регулярное выражение выглядит так, как будто оно потерпит неудачу для любого адреса электронной почты с иностранными символами или множеством нестандартных символов.
EricP
2
Проверка адресов электронной почты с помощью регулярных выражений - это, как правило, ужасная идея ... но если вам нужно, здесь есть отличная ссылка. Регулярно-
экспрессии.info/
9
Это регулярное выражение и веб-сайт не так. Есть много новых TLD более 6 символов. Не следуй этому.
jsgoupil
14

если вы еще не используете .net 4.5:

/// <summary>
/// TODO: AFTER WE UPGRADE TO .NET 4.5 THIS WILL NO LONGER BE NECESSARY.
/// </summary>
public class EmailAnnotation : RegularExpressionAttribute
{
    static EmailAnnotation()
    {
        DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(EmailAnnotation), typeof(RegularExpressionAttributeAdapter));
    }

    /// <summary>
    /// from: http://stackoverflow.com/a/6893571/984463
    /// </summary>
    public EmailAnnotation()
        : base(@"^[\w!#$%&'*+\-/=?\^_`{|}~]+(\.[\w!#$%&'*+\-/=?\^_`{|}~]+)*"
            + "@"
            + @"((([\-\w]+\.)+[a-zA-Z]{2,4})|(([0-9]{1,3}\.){3}[0-9]{1,3}))$") { }

    public override string FormatErrorMessage(string name)
    {
        return "E-mail is not valid";
    }
}

Тогда вы можете сделать это:

    public class ContactEmailAddressDto
    {
        public int ContactId { get; set; }
        [Required]
        [Display(Name = "New Email Address")]
        [EmailAnnotation] //**<----- Nifty.**
        public string EmailAddressToAdd { get; set; }
    }
mcfea
источник
1
Мне нравится статический конструктор.
Брайан Суини
1
@BrianSweeney, я не могу взять кредит на это: P. Еще один лакомый кусочек, который я получил отсюда много лет назад.
mcfea
10

Я использую MVC 3. Пример свойства адреса электронной почты в одном из моих классов:

[Display(Name = "Email address")]
[Required(ErrorMessage = "The email address is required")]
[Email(ErrorMessage = "The email address is not valid")]
public string Email { get; set; }

Удалите, Requiredесли ввод является необязательным. Нет необходимости в регулярных выражениях, хотя у меня есть один, который охватывает все параметры в адресе электронной почты до уровня RFC 2822 (это очень долго).

Питер Смит
источник
3
В каком пространстве имен находится ваш почтовый атрибут? Или это пользовательский атрибут?
Пользователь
5
MVC 4 использует [EmailAddress]и нужно иметьusing System.ComponentModel.DataAnnotations;
Петр Кула
1
Казалось бы, что бы я ни делал, использование того Emailили другого RegularExpressionполя делает обязательным. Удаление Requiredаннотации не имеет никакого эффекта. Любые предложения о том, что нужно сделать, чтобы поля с RegularExpressionпроверкой принимали пустые поля?
Эрик К
@QuantumDynamix Попробуйте добавить пустой тест строки в ваше регулярное выражение в качестве опции. Никогда не пробовал, но кто знает?
Питер Смит
7
[Required(ErrorMessage = "Please enter Social Email id")]
    [DataType(DataType.EmailAddress)]
    [EmailAddress]
    public string Email { get; set; }
Куганрайх Раджендран
источник
4

Использовал приведенный выше код в проекте MVC5, и он прекрасно работает с ошибкой проверки. Просто попробуйте этот код

   [Required]
   [Display(Name = "Email")]
   [EmailAddress]

   [RegularExpression(@"^([A-Za-z0-9][^'!&\\#*$%^?<>()+=:;`~\[\]{}|/,₹€@ ][a-zA-z0- 
    9-._][^!&\\#*$%^?<>()+=:;`~\[\]{}|/,₹€@ ]*\@[a-zA-Z0-9][^!&@\\#*$%^?<> 
        ()+=':;~`.\[\]{}|/,₹€ ]*\.[a-zA-Z]{2,6})$", ErrorMessage = "Please enter a 
   valid Email")]


   public string ReceiverMail { get; set; }
Кальяни Раторе
источник
1
Добро пожаловать в StackOverflow. Ответы только на код не считаются хорошей практикой. Пожалуйста, опишите, что это делает и как это решает проблему.
Quinz
0

Скрипты обычно загружаются в конце html-страницы, и MVC рекомендует использовать пакеты, просто говоря. Поэтому лучше всего, чтобы ваши jquery.validateфайлы были каким-то образом изменены или не обновлены до последней версии, так как они проверяют входящие сообщения электронной почты.

Таким образом, вы можете либо обновить / обновить свой пакет nuget, либо написать свою собственную функцию.

Вот пример, который вы бы добавили в дополнительный файл после jquery.validate.unobtrusive :

$.validator.addMethod(
    "email",
    function (value, element) {
        return this.optional( element ) || /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test( value );
    },
    "This e-mail is not valid"
);

Это просто копия и вставка текущего jquery.validateRegex, но таким образом вы можете установить свое собственное сообщение об ошибке / добавить дополнительные методы в поля, которые вы можете проверить в ближайшем будущем.

Tiramonium
источник
0

В соответствии с вышеизложенным это исправит проверку адреса электронной почты на стороне сервера:

[Display(Name = "Email address")]
[Required(ErrorMessage = "The email address is required")]
[EmailAddress(ErrorMessage = "Invalid Email Address")]
public string Email { get; set; }

Тем не мение...

Если вы используете проверку на стороне клиента JQuery, вы должны знать, что электронная почта проверяет по-разному на стороне сервера (проверка модели) и на стороне клиента (проверка JQuery). В этом примере test @ (адрес электронной почты домена верхнего уровня) произойдет сбой на стороне сервера, но на стороне клиента будет выполнена проверка.

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

$.validator.methods.email = function (value, element) {
    return this.optional(element) || /^[a-z0-9._]+@[a-z]+\.[a-z.]+/.test(value);
}
Джон Райан
источник