การตรวจสอบที่อยู่อีเมลโดยใช้แอตทริบิวต์ประเภทข้อมูล 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 แก้ปัญหาคือการใช้งานที่อยู่ภายในEmailAddressAttributeSystem.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.")]
Wellington Zanelli

15
@Wellington Zanelli - ไม่สามารถใช้ DataType (DataType.EmailAddress) ในการตรวจสอบอินพุตของผู้ใช้ มันถูกใช้เพื่อให้คำแนะนำ UI สำหรับการแสดงค่าโดยใช้เทมเพลตการแสดงผล / แก้ไข
เลียม

3
@Jni DataType.EmailAddressไม่ได้เกี่ยวกับการตรวจสอบ มันเป็นเรื่องของการนำเสนอข้อมูล ...
Sebastian Xawery Wiawniowiecki

3
ฉันมีปัญหาเดียวกันและสำหรับฉันการตรวจสอบอีเมลทำงานได้ดียกเว้นอีเมลเช่น 'name @ xxx' มีใครเห็นอีกบ้างไหม
Kremena Lalova

3
@KremenaLalova name@xxxเป็นที่อยู่อีเมลที่ถูกต้องสมบูรณ์ดังนั้นจึงไม่มีอะไรผิดปกติกับวิธีการนั้น ลองพิจารณาตัวอย่างusername@localhostเช่น
John Bergman

39

ลองวิธีการช่วยเหลือแทนHtml.EditorForHtml.TextBoxFor


1
นี่คือคำตอบที่ถูกต้องเนื่องจากจะใช้ประเภทข้อมูลและข้อผิดพลาดที่คุณเพิ่มไว้ในแบบจำลองของคุณแล้ว
Ricardo Sanchez

4
วิธีนี้ไม่สามารถตรวจสอบ TLD โดเมนเพื่อให้คนสามารถใส่ใน myname @ สิ่งและปล่อยออก .com และมันจะตรวจสอบความถูกต้อง
JasonH

8
myname @ Anything เป็นที่อยู่อีเมลที่ถูกต้อง
michaelmsm89

ทำงานได้อย่างสมบูรณ์แบบสำหรับ mvc 4 ขอบคุณ
Jose Gomez

สิ่งที่ต้องเขียนภายใน html.Editor เพื่อตรวจสอบอีเมล
Neeraj Kumar

28

คุณต้องใช้คุณสมบัติ Regular Expression เช่นนี้:

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

และอย่าลบ [จำเป็น] เพราะ [RegularExpression] จะไม่มีผลกับฟิลด์ว่าง


8
Skool รุ่นเก่านั้นดี แต่เนื่องจาก Microsoft ใช้งานคุณสมบัตินี้จะจัดการกับข้อบกพร่องและการควบคุมที่อาจเกิดขึ้นได้ในบางสถานการณ์ประเทศเขตเวลาหรือดาวเคราะห์ ดังนั้นวิธีที่ดีที่สุดคือใช้รหัสฐานที่วางจำหน่ายอย่างสมบูรณ์แบบมากกว่า regex ที่กำหนดเอง Regex ของคุณคำนึงถึงโดเมนระดับบนสุดใหม่หรือไม่
Piotr Kula

2
regex นั้นดูเหมือนจะล้มเหลวสำหรับที่อยู่อีเมลใด ๆ ที่มีอักขระต่างประเทศหรืออักขระที่ไม่ได้มาตรฐานจำนวนมาก
EricP

2
ตรวจสอบที่อยู่อีเมลที่มี regex มักจะเป็นความคิดที่น่ากลัว ... แต่ถ้าคุณต้องมีการอ้างอิงที่ยอดเยี่ยมที่นี่ .. regular-expressions.info/email.html
Molomby

9
regex และเว็บไซต์นี้ผิด มี 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
ฉันชอบตัวสร้างแบบคงที่
Brian Sweeney

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
แอตทริบิวต์อีเมลของคุณคือ namespace ใด หรือมันเป็นคุณสมบัติที่กำหนดเอง?
ผู้ใช้

5
การใช้ MVC 4 [EmailAddress]และคุณต้องมีusing System.ComponentModel.DataAnnotations;
Piotr Kula

1
ดูเหมือนว่าไม่ว่าฉันจะทำอะไรการใช้งานอย่างใดอย่างหนึ่งEmailหรือRegularExpressionทำให้จำเป็นต้องใช้ฟิลด์ การลบRequiredคำอธิบายประกอบไม่มีผลกระทบ ข้อเสนอแนะเกี่ยวกับสิ่งที่ต้องทำเพื่อให้เขตข้อมูลที่มีRegularExpressionการตรวจสอบยอมรับเขตข้อมูลว่างเปล่า
Eric K

@QuantumDynamix ลองเพิ่มการทดสอบสตริงว่างในนิพจน์ปกติของคุณเป็นตัวเลือก ไม่เคยลอง แต่ใครจะรู้
Peter Smith


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 ปัจจุบันแต่ด้วยวิธีนี้คุณสามารถตั้งค่าข้อความแสดงข้อผิดพลาดที่กำหนดเอง / เพิ่มวิธีการพิเศษให้กับเขตข้อมูลที่คุณอาจต้องการตรวจสอบในอนาคตอันใกล้


0

ตามข้างต้นนี้จะแก้ไขการตรวจสอบด้านเซิร์ฟเวอร์ของที่อยู่อีเมล:

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

อย่างไรก็ตาม ...

หากคุณกำลังใช้การตรวจสอบความถูกต้องฝั่งไคลเอ็นต์ JQuery คุณควรรู้ว่าอีเมลตรวจสอบฝั่งเซิร์ฟเวอร์ที่แตกต่างกัน ในตัวอย่าง test @ นั้น (ที่อยู่อีเมลโดเมนระดับบนสุด) จะล้มเหลวฝั่งเซิร์ฟเวอร์ แต่จะตรวจสอบความถูกต้องในฝั่งไคลเอ็นต์

หากต้องการแก้ไขความไม่เสมอภาคนี้คุณสามารถแทนที่การตรวจสอบความถูกต้องอีเมลด้านไคลเอ็นต์เริ่มต้นดังนี้:

$.validator.methods.email = function (value, element) {
    return this.optional(element) || /^[a-z0-9._]+@[a-z]+\.[a-z.]+/.test(value);
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.