Xác thực địa chỉ email bằng các thuộc tính kiểu dữ liệu ASP.NET MVC


163

Tôi có một số vấn đề với việc xác nhận Email.

Trong mô hình của tôi:

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

Theo quan điểm của tôi:

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

Bây giờ nó hiển thị chính xác cho tôi "Trường không thể trống" khi bạn để trống trường. Nhưng khi bạn điền vào một địa chỉ email không hợp lệ như: "fwenrjfw" thì biểu mẫu không nói "E-mail không hợp lệ".

Làm cách nào tôi có thể lấy biểu mẫu để xác thực đầu vào dưới dạng địa chỉ email? Tôi đang tìm kiếm một số trợ giúp với điều này.

Câu trả lời:


327

Nếu bạn đang sử dụng .NET Framework 4.5, giải pháp là sử dụng EmailAddressAttributecái nào nằm bên trong System.ComponentModel.DataAnnotations.

Mã của bạn sẽ trông giống như thế này:

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

Cảm ơn bạn @Shittu Olugbenga! Nhưng tôi không thể hiểu tại sao điều này không hoạt động:[DataType(DataType.EmailAddress, ErrorMessage = "Error message.")]
Wellington Zanelli

15
@Wellington Zanelli - Không thể sử dụng Kiểu dữ liệu (DataType.EmailAddress) để xác thực đầu vào của người dùng. Nó chỉ được sử dụng để cung cấp gợi ý UI để hiển thị các giá trị bằng cách sử dụng các mẫu hiển thị / trình soạn thảo.
Liam

3
@Jni DataType.EmailAddresskhông phải là về xác nhận. Đó là về trình bày dữ liệu ...
Sebastian Xawery Wiśniowiecki

3
Tôi có cùng một vấn đề và đối với tôi, xác thực email hoạt động tốt ngoại trừ các email như 'name @ xxx'. Đã có người khác nhìn thấy điều này?
Kremena Lalova

3
@KremenaLalova name@xxxlà một địa chỉ email hoàn toàn hợp lệ, vì vậy không có gì sai với phương pháp đó. Hãy xem xét ví username@localhostdụ ví dụ.
John Bergman

39

Hãy thử Html.EditorForphương pháp trợ giúp thay vì Html.TextBoxFor.


1
Đây là câu trả lời đúng vì nó sẽ sử dụng kiểu dữ liệu và lỗi bạn đã thêm trong mô hình của mình.
Ricardo Sanchez

4
phương pháp này không kiểm tra tên miền tld, vì vậy ai đó có thể đặt tên my @ @ và bỏ qua .com và nó sẽ xác nhận chính xác
JasonH

8
myname @ anything là một địa chỉ email hợp lệ
michaelmsm89

Làm việc hoàn hảo cho mvc 4. Cảm ơn bạn.
Jose Gomez

Viết gì bên trong html.Editor để xác thực email?
Neeraj Kumar

28

Bạn cần sử dụng Thuộc tính thường xuyên, một cái gì đó như thế này:

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

Và không xóa [Bắt buộc] vì [Chính quy] không ảnh hưởng đến các trường trống.


8
Skool cũ là tốt nhưng vì Microsoft đã triển khai một thuộc tính, nó giải quyết các lỗi và sự giám sát có thể xảy ra trong một số tình huống, quốc gia, múi giờ hoặc hành tinh. Vì vậy, tốt nhất nên sử dụng một cơ sở mã được phát hành đầy đủ hơn regex tùy chỉnh. Chẳng hạn regex của bạn có xem xét các tên miền cấp cao mới không?
Piotr Kula

2
Regex đó có vẻ như sẽ thất bại đối với bất kỳ địa chỉ email có ký tự nước ngoài hoặc nhiều ký tự không chuẩn trong đó.
EricP

2
Members địa chỉ email với regex thường là một ý tưởng khủng khiếp ... nhưng nếu bạn phải, có một tài liệu tham khảo tuyệt vời ở đây .. regular-expressions.info/email.html
Molomby

9
Regex và trang web này là sai. Có rất nhiều TLD mới hơn 6 ký tự. Đừng theo cái này.
jsgoupil

14

nếu bạn chưa sử dụng .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";
    }
}

Sau đó, bạn có thể làm điều này:

    public class ContactEmailAddressDto
    {
        public int ContactId { get; set; }
        [Required]
        [Display(Name = "New Email Address")]
        [EmailAnnotation] //**<----- Nifty.**
        public string EmailAddressToAdd { get; set; }
    }

1
Tôi thích các nhà xây dựng tĩnh.
Brian Sweeney

1
@BrianSweeney, tôi không thể lấy tín dụng cho nó: P. Một miếng ngon khác tôi nhận được từ đây nhiều năm trước.
mcf

10

Tôi sử dụng MVC 3. Một ví dụ về thuộc tính địa chỉ email trong một trong các lớp của tôi là:

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

Loại bỏ Requirednếu đầu vào là tùy chọn. Không cần biểu thức thông thường mặc dù tôi có một tùy chọn bao gồm tất cả các tùy chọn trong một địa chỉ email lên đến cấp RFC 2822 (rất dài).


3
Không gian tên thuộc tính Email của bạn là gì? Hay nó là một thuộc tính tùy chỉnh?
Người dùng

5
Sử dụng MVC 4 [EmailAddress]và bạn cần phải cóusing System.ComponentModel.DataAnnotations;
Piotr Kula

1
Dường như bất kể tôi làm gì, việc sử dụng một trong hai Emailhoặc RegularExpressionlàm cho trường bắt buộc. Loại bỏ Requiredchú thích không có hiệu lực. Bất kỳ đề xuất nào về những gì cần làm để làm cho các trường có RegularExpressionxác nhận chấp nhận các trường trống?
Eric K

@QuantumDOUNDix Hãy thử thêm một bài kiểm tra chuỗi trống vào biểu thức thông thường của bạn dưới dạng tùy chọn. Chưa bao giờ thử nó, nhưng ai biết?
Peter Smith

7
[Required(ErrorMessage = "Please enter Social Email id")]
    [DataType(DataType.EmailAddress)]
    [EmailAddress]
    public string Email { get; set; }

4

Đã sử dụng mã trên trong dự án MVC5 và nó hoạt động hoàn toàn tốt với lỗi xác thực. Hãy thử mã này

   [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
Chào mừng bạn đến với StackOverflow. Câu trả lời chỉ có mã không được coi là một thực hành tốt. Hãy giải thích những gì nó làm và cách nó giải quyết vấn đề.
quinz

0

Các tập lệnh thường được tải ở cuối trang html và MVC khuyên bạn nên sử dụng các gói, chỉ cần nói. Vì vậy, cách tốt nhất của tôi là các jquery.validatetệp của bạn đã bị thay đổi theo một cách nào đó hoặc không được cập nhật lên phiên bản mới nhất, vì chúng xác nhận các đầu vào e-mail.

Vì vậy, bạn có thể cập nhật / làm mới gói nuget của bạn hoặc viết chức năng của riêng bạn, thực sự.

Đây là một ví dụ mà bạn sẽ thêm vào một tệp bổ sung sau 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"
);

Đây chỉ là một bản sao và dán của jquery.validateRegex hiện tại , nhưng bằng cách này bạn có thể đặt thông báo lỗi tùy chỉnh / thêm phương thức bổ sung vào các trường bạn có thể muốn xác thực trong tương lai gần.


0

Theo như trên, điều này sẽ khắc phục xác thực phía máy chủ của Địa chỉ Email:

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

Tuy nhiên...

Nếu bạn đang sử dụng xác thực phía máy khách JQuery, bạn nên biết rằng Email xác thực các mặt máy chủ khác nhau (xác thực mô hình) cho phía máy khách (xác thực JQuery). Trong ví dụ thử nghiệm đó @ (một địa chỉ email tên miền cấp cao nhất) sẽ không thành công ở phía máy chủ nhưng sẽ xác thực tiền phạt ở phía máy khách.

Để khắc phục sự chênh lệch này, bạn có thể ghi đè xác thực email phía máy khách mặc định như sau:

$.validator.methods.email = function (value, element) {
    return this.optional(element) || /^[a-z0-9._]+@[a-z]+\.[a-z.]+/.test(value);
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.