2013-05-23 36 views
129

Tôi gặp một số vấn đề với việc xác thực một Email.Xác nhận địa chỉ email bằng cách sử dụng các thuộc tính kiểu dữ liệu ASP.NET MVC

Trong mẫu 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ó được một cách chính xác cho thấy tôi "Field không thể để trống" khi bạn rời sân 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ệ".

Tôi làm cách nào để lấy biểu mẫu xác thực dữ liệu nhập 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.

Trả lời

17

Bạn cần phải sử dụng biểu thức chính quy thuộc tính, một cái gì đó như thế này:

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

Và đừng xóa [Bắt buộc] vì [biểu thức chính quy] không ảnh hưởng đến các lĩnh vực có sản phẩm nào.

+7

Skool cũ là tốt, nhưng kể từ khi Microsoft thực hiện 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. SO tốt nhất của nó để sử dụng một cơ sở mã phát hành đầy đủ hơn regex tùy chỉnh. Ví dụ, regex của bạn có xem xét các tên miền cấp cao nhất mới không? – ppumkin

+2

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

+2

Xác thực địa chỉ email bằng regex thường là ý tưởng tồi tệ ... nhưng nếu bạn phải, có một tham chiếu tuyệt vời tại đây .. http://www.regular-expressions.info/email.html – Molomby

36

Thử phương thức trợ giúp Html.EditorFor 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 vào trong mô hình của mình. –

+3

phương pháp này không kiểm tra miền tld, vì vậy ai đó có thể đặt vào myname @ mọi thứ và rời khỏi .com và nó sẽ xác nhận chính xác – JasonH

+7

myname @ bất kỳ địa chỉ email hợp lệ nào – michaelmsm89

9

tôi sử dụng MVC 3. Một ví dụ về sở hữu địa chỉ email trong một lớp học 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; } 

Tháo Required nếu đầu vào là không bắt buộc. Không cần biểu thức chính quy mặc dù tôi có một biểu thức bao gồm tất cả các tùy chọn trong một địa chỉ email lên đến mức RFC 2822 (rất dài).

+3

Thuộc tính email của bạn là gì? Hoặc là một thuộc tính tùy chỉnh? – User

+4

MVC 4 sử dụng '[EmailAddress]' và bạn cần phải có 'using System.ComponentModel.DataAnnotations; ' – ppumkin

+4

cho .net 4.5 không 4.0 – bflemi3

263

Nếu bạn đang sử dụng .NET Framework 4.5, giải pháp là sử dụng EmailAddressAttribute 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; } 
+7

EmailAddressAttribute hoạt động như thế nào? –

+0

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 =" Thông báo lỗi. ")]' –

+12

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

11

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

Các tập lệnh thường được tải vào cuối trang html và MVC đề xuất sử dụng các gói, chỉ cần nói. Vì vậy, đặt cược tốt nhất của tôi là các tệp jquery.validate của bạn đã bị thay đổi theo một số cách hoặc không được cập nhật lên phiên bản mới nhất, vì chúng xác thực 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ự.

Dưới đây là một ví dụ mà bạn sẽ thêm vào một tập tin thêm sau jquery.validate.unobtrusive:

$.validator.addMethod(
    "email", 
    function (value, element) { 
     return this.optional(element) || /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-][email protected][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 sao chép và dán các hiện hành jquery.validate Regex, nhưng cách này bạn có thể thiết lập thông báo lỗi tùy chỉnh của bạn/thêm các phương thức bổ sung cho các trường mà bạn có thể muốn xác thực trong tương lai gần.

Các vấn đề liên quan