Перевірка електронної адреси за допомогою атрибутів типу 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", то у формі не вказано "Електронна пошта недійсна".

Як я можу отримати форму для підтвердження введення як електронної адреси? Я шукаю допомоги в цьому.

Відповіді:


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не про валідацію. Йдеться про представлення даних ...
Себастьян Ксавері Wiśniowiecki

3
У мене є той самий випуск, і для мене перевірка електронної пошти працює чудово, за винятком електронних листів типу "name @ xxx". Хтось ще бачив це?
Кремена Лалова

3
@KremenaLalova name@xxx- цілком дійсна адреса електронної пошти, тому в цьому методі немає нічого поганого. Розглянемо, наприклад, username@localhostприклад.
Джон Бергман

39

Спробуйте Html.EditorForдопоміжний метод замість Html.TextBoxFor.


1
Це правильна відповідь, оскільки він використовуватиме тип даних та помилку, які ви вже додали у вашу модель.
Рікардо Санчес

4
цей метод не перевіряє домен tld, тому хтось може поставити своє ім’я @ що завгодно і залишити .com, і він перевірить правильно
JasonH

8
myname @ все, що є дійсною адресою електронної пошти
michaelmsm89,

Відмінно працював для mvc 4. Дякую.
Хосе Гомес

Що написати всередині html.Editor для перевірки електронної пошти?
Неєрай Кумар

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
Перевірка адреси електронної пошти з регулярним виразом, як правило , погана ідея ... але якщо треба, є відмінна посилання тут .. regular-expressions.info/email.html
Molomby

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

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;
Piotr Kula

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. Відповіді, що стосуються лише коду, не вважаються хорошою практикою. Розкажіть, будь ласка, що це робить і як вона вирішує проблему.
Квінз

0

Сценарії зазвичай завантажуються в кінці сторінки html, і MVC рекомендує використовувати пакет, просто кажучи. Тож найкраща моя ставка, що вашаjquery.validate файли якимось чином змінені або не оновлені до останньої версії, оскільки вони підтверджують введення електронної пошти.

Таким чином, ви можете або оновити / оновити свій пакунок, або написати власну функцію.

Ось приклад, який ви додали б у додатковий файл після 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, але таким чином ви можете встановити своє власне повідомлення про помилку / додати додаткові методи до полів, які, можливо, ви хочете перевірити найближчим часом.


0

Згідно з вищезазначеним, це виправить перевірку на адресу сервера електронної адреси:

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

Однак ...

Якщо ви використовуєте перевірку на стороні клієнта JQuery, ви повинні знати, що електронна пошта перевіряє по-різному сторону сервера (перевірка моделі) на стороні клієнта (перевірка JQuery). У цьому тестовому прикладі @ @ (адреса електронної пошти верхнього рівня) не вдасться на стороні сервера, але буде підтверджено штраф на стороні клієнта.

Щоб виправити цю невідповідність, ви можете змінити перевірку електронної пошти на стороні клієнта за замовчуванням наступним чином:

$.validator.methods.email = function (value, element) {
    return this.optional(element) || /^[a-z0-9._]+@[a-z]+\.[a-z.]+/.test(value);
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.