2012-01-24 31 views
40

tôi có mô hình sau đây:Email mô hình xác nhận với DataAnnotations và DataType

public class FormularModel 
{ 
    [Required] 
    public string Position { get; set; } 
    [Required] 
    [DataType(DataType.EmailAddress)] 
    public string Email { get; set; } 
    [Required] 
    public string Webcode { get; set; } 
} 

xác nhận yêu cầu hoạt động tốt. Nhưng khi tôi thử với DataType nó không phản ứng.

Đây là mã dao cạo của tôi cho sự kiểm soát email:

@Html.TextBoxFor 
      (model => model.Email, 
      new { @style = "width: 175px;", @class = "txtField" } 
     ) * 

Vì vậy, bất cứ ai biết câu trả lời?

TIA

Trả lời

99

DataType thuộc tính được sử dụng cho các mục đích định dạng, không để xác nhận.

Tôi khuyên bạn nên sử dụng ASP.NET MVC 3 Futures để xác thực email.

Mẫu mã:

[Required] 
[DataType(DataType.EmailAddress)] 
[EmailAddress] 
public string Email { get; set; } 

Nếu bạn tình cờ được sử dụng .NET Framework 4.5, bây giờ có một xây dựng trong EmailAddressAttribute sống trong System.ComponentModel.DataAnnotations.EmailAddressAttribute.

+2

nhưng nó chấp nhận 'something @ domain'. tôi đoán tôi sẽ đi với biểu thức chính quy lần này. –

+1

Vì chúng tôi không thể cung cấp thông báo lỗi tùy chỉnh. Đang sử dụng cách sau đây thay thế. [EmailValidation (ErrorMessage = "Địa chỉ email đã tồn tại")] [RegularExpression ("^ [a-z0-9 _ \\ + -] + (\\. [A-z0-9 _ \\ + -] +) * @ [a-z0-9 -] + (\\.[a-z0-9] +) * \\. ([az] {2,4}) $ ", ErrorMessage =" Định dạng email không hợp lệ. ")] [Bắt buộc (ErrorMessage =" Vui lòng nhập địa chỉ email của bạn . "), StringLength (50)] chuỗi công cộng Email {get; set;} –

+1

Regex sẽ thất bại cho" ryan.o'[email protected] " – jksemple

2

tôi đã xem xét mã nguồn (đảo ngược thiết kế bởi Reflector) và DataType biến thể đang thực sự thậm chí không được thực hiện! (Đây là số DateType.Date)

Vì vậy, nó sẽ không hoạt động.

Tôi sẽ đích thân sử dụng RegexValidation cho email.


Để rõ ràng, đây là việc thực hiện IsValid trong lớp DataTypeAttribute:

public override bool IsValid(object value) 
{ 
    return true; 
} 
+1

hehehe ... mọi thứ đều hợp lệ! =) –

+0

Xác thực Regex các địa chỉ email là một ý tưởng thực sự tồi; RFC cho phép nhiều hoán vị kỳ lạ để làm cho một regex khả thi. Ngay cả các email được gắn thẻ, như được Gmail hỗ trợ, thường bị từ chối là không hợp lệ, mặc dù hoàn toàn hợp lệ. (http://davidcel.is/blog/2012/09/06/stop-validating-email-addresses-with-regex/ điểm này tốt). http://programmers.stackexchange.com/questions/78353/how-far-should-one-take-e-mail-address-validation khám phá các tùy chọn khác nhau, nhưng đảm bảo 100% duy nhất là gửi địa chỉ email và kiểm tra bị trả lại. –

8

Dự án DataAnnotationsExtensions có số Email attribute mà bạn có thể sử dụng.

+0

Tôi đã sử dụng cái này. Khá tốt quá! Tôi đã thử để nhớ tên nhưng không thể đưa nó vào tâm trí của tôi. Kết thúc gợi ý MVC 3 tương lai –

-6

Tôi nghĩ bạn cần thêm mã html một thành phần Html.ValidationMessageFor. Thành phần này cho thấy xác thực.

Mã này có thể được (sử dụng dao cạo):

@Html.TextBoxFor(model => model.Email) 
@Html.ValidationMessageFor(model => model.Email) 

thử nó.

+0

Mã này không thực hiện bất kỳ xác thực nào –

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