Validasi alamat email menggunakan atribut tipe data ASP.NET MVC

163

Saya memiliki beberapa masalah dengan validasi Email.

Dalam Model saya:

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

Dalam pandangan saya:

<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)

Sekarang dengan benar menunjukkan kepada saya "Bidang tidak boleh kosong" ketika Anda membiarkan bidang itu kosong. Tetapi ketika Anda mengisi alamat email yang tidak valid seperti: "fwenrjfw" maka formulir itu tidak mengatakan "E-mail tidak valid".

Bagaimana saya bisa mendapatkan formulir untuk memvalidasi input sebagai alamat email? Saya mencari bantuan dengan ini.

Afca Jawa
sumber

Jawaban:

327

Jika Anda menggunakan .NET Framework 4.5, solusinya adalah menggunakan EmailAddressAttributeyang berada di dalam System.ComponentModel.DataAnnotations.

Kode Anda akan terlihat mirip dengan ini:

[Display(Name = "Email address")]
[Required(ErrorMessage = "The email address is required")]
[EmailAddress(ErrorMessage = "Invalid Email Address")]
public string Email { get; set; }
Shittu Joseph Olugbenga
sumber
@Shittu Olugbenga terima kasih! Tapi saya tidak mengerti mengapa ini tidak berhasil:[DataType(DataType.EmailAddress, ErrorMessage = "Error message.")]
Wellington Zanelli
15
@Wellington Zanelli - DataType (DataType.EmailAddress) tidak dapat digunakan untuk memvalidasi input pengguna. Ini hanya digunakan untuk memberikan petunjuk UI untuk memberikan nilai menggunakan templat tampilan / editor.
Liam
3
@Jni DataType.EmailAddressbukan tentang validasi. Ini tentang presentasi data ...
Sebastian Xawery Wiśniowiecki
3
Saya memiliki masalah yang sama dan bagi saya validasi email berfungsi dengan baik kecuali untuk email seperti 'nama @ xxx'. Adakah yang melihat ini?
Kremena Lalova
3
@KremenaLalova name@xxxadalah alamat email yang benar-benar valid, jadi tidak ada yang salah dengan metode itu. Perhatikan contohnya username@localhostmisalnya.
John Bergman
39

Cobalah Html.EditorFormetode pembantu alih-alih Html.TextBoxFor.

hazimdikenli
sumber
1
Ini adalah jawaban yang benar karena akan menggunakan tipe data dan kesalahan yang sudah Anda tambahkan dalam model Anda.
Ricardo Sanchez
4
metode ini tidak memeriksa domain tld, sehingga seseorang dapat memasukkan myname @ apa pun dan meninggalkan .com dan itu akan divalidasi dengan benar
JasonH
8
myname @ apa pun alamat email yang valid
michaelmsm89
Bekerja dengan sempurna untuk MVC 4. Terima kasih.
Jose Gomez
Apa yang harus ditulis di dalam html.Editor untuk memvalidasi email?
Neeraj Kumar
28

Anda perlu menggunakan Atribut RegularExpression, sesuatu seperti ini:

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

Dan jangan hapus [Wajib] karena [RegularExpression] tidak memengaruhi bidang kosong.

Alexander Imra
sumber
8
Skool lama memang bagus, tetapi karena Microsoft menerapkan atribut yang menangani bug dan pengawasan yang dapat terjadi pada situasi, negara, zona waktu atau planet tertentu. JADI yang terbaik untuk menggunakan basis kode yang dirilis penuh daripada regex kustom. Apakah regex Anda mempertimbangkan domain tingkat atas yang baru, misalnya?
Piotr Kula
2
Regex itu kelihatannya akan gagal untuk semua alamat email dengan karakter asing atau banyak karakter tidak standar di dalamnya.
EricP
2
Memvalidasi alamat email dengan regex biasanya merupakan ide yang buruk ... tetapi jika Anda harus, ada referensi yang sangat baik di sini .. regular-expressions.info/email.html
Molomby
9
Regex dan situs web ini salah. Ada banyak TLD baru lebih dari 6 karakter. Jangan ikuti yang ini.
jsgoupil
14

jika Anda belum menggunakan .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";
    }
}

Maka Anda dapat melakukan ini:

    public class ContactEmailAddressDto
    {
        public int ContactId { get; set; }
        [Required]
        [Display(Name = "New Email Address")]
        [EmailAnnotation] //**<----- Nifty.**
        public string EmailAddressToAdd { get; set; }
    }
mcfea
sumber
1
Saya suka konstruktor statis.
Brian Sweeney
1
@ BrianSweeney, saya tidak bisa mengambil kredit untuk itu: P. Berita gembira lain yang saya dapatkan dari sini bertahun-tahun yang lalu.
mcfea
10

Saya menggunakan MVC 3. Contoh properti alamat email di salah satu kelas saya adalah:

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

Hapus Requiredjika inputnya opsional. Tidak perlu untuk ekspresi reguler walaupun saya punya satu yang mencakup semua opsi dalam alamat email hingga level RFC 2822 (sangat panjang).

Peter Smith
sumber
3
Apa namespace atribut Email Anda? Atau apakah itu atribut khusus?
Pengguna
5
MVC 4 menggunakan [EmailAddress]dan Anda harus memilikiusing System.ComponentModel.DataAnnotations;
Piotr Kula
1
Tampaknya apa pun yang saya lakukan, penggunaan salah satu Emailatau RegularExpressionmembuat bidang diperlukan. Menghapus Requiredanotasi tidak berpengaruh. Ada saran tentang apa yang harus dilakukan untuk membuat bidang dengan RegularExpressionvalidasi menerima bidang kosong?
Eric K
@ QuantumDynamix Cobalah menambahkan tes string kosong ke ekspresi reguler Anda sebagai opsi. Belum pernah mencobanya, tetapi siapa yang tahu?
Peter Smith
7
[Required(ErrorMessage = "Please enter Social Email id")]
    [DataType(DataType.EmailAddress)]
    [EmailAddress]
    public string Email { get; set; }
Kuganrajh Rajendran
sumber
4

Digunakan kode di atas dalam proyek MVC5 dan berfungsi dengan baik dengan kesalahan validasi. Coba saja kode ini

   [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; }
Kalyani Rathore
sumber
1
Selamat datang di StackOverflow. Jawaban hanya kode tidak dianggap sebagai praktik yang baik. Tolong jelaskan apa yang dilakukan dan bagaimana ini menyelesaikan masalah.
quinz
0

Script biasanya dimuat di akhir halaman html, dan MVC merekomendasikan penggunaan bundel, hanya mengatakan. Jadi taruhan terbaik saya adalah Andajquery.validate file diubah dalam beberapa cara atau tidak diperbarui ke versi terbaru, karena mereka memvalidasi input email.

Jadi Anda bisa memperbarui / menyegarkan paket nuget Anda atau menulis fungsi Anda sendiri, sungguh.

Berikut ini contoh yang akan Anda tambahkan dalam file tambahan setelah 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"
);

Ini hanya salin dan tempel jquery.validateRegex saat ini , tetapi dengan cara ini Anda dapat mengatur pesan kesalahan khusus / menambahkan metode tambahan ke bidang yang mungkin ingin Anda validasi dalam waktu dekat.

Tiramonium
sumber
0

Seperti di atas ini akan memperbaiki validasi sisi server dari Alamat Email:

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

Namun...

Jika Anda menggunakan validasi sisi klien JQuery, Anda harus tahu bahwa Email memvalidasi sisi server yang berbeda (validasi model) ke sisi klien (validasi JQuery). Dalam contoh pengujian @ (alamat email domain tingkat atas) akan gagal di sisi server tetapi akan divalidasi dengan baik di sisi klien.

Untuk memperbaiki perbedaan ini, Anda dapat mengganti validasi email sisi klien default sebagai berikut:

$.validator.methods.email = function (value, element) {
    return this.optional(element) || /^[a-z0-9._]+@[a-z]+\.[a-z.]+/.test(value);
}
Jon Ryan
sumber