2009-08-31 4 views
7

Tôi có một lớp khách hàng có cả thuộc tính PhoneNumber và Email. Sử dụng DataAnnotations tôi có thể trang trí các thuộc tính với các thuộc tính xác nhận DataType, nhưng tôi không thể thấy những gì đang nhận được tôi.Có một tham chiếu tốt cho chú thích dữ liệu liên quan đến cách DataType hoạt động không?

Ví dụ:

[DataType(DataType.PhoneNumber)] 
public string PhoneNumber {get; set;} 

Tôi có một bài kiểm tra đơn vị được phân công "1515999A" vào thuộc tính này. Khi tôi bước qua nhân tố xác thực, giá trị được coi là hợp lệ cho một số điện thoại. Tôi đã nghĩ rằng điều này sẽ không hợp lệ.

Tôi google'd xung quanh một số nhưng không thể tìm thấy một lời giải thích phong nha về những gì các DataTypes liệt kê khác nhau thực sự bắt. Có một tài liệu tham khảo đáng giá ở đâu đó không?

Edit:

Dưới đây là ruột của những gì tôi đang sử dụng cho một Á hậu xác nhận ...

public virtual XLValidationIssues ValidateAttributes<TEntity>(TEntity entity) 
    { 
     var validationIssues = new XLValidationIssues(); 

     // Get list of properties from validationModel 
     var props = entity.GetType().GetProperties(); 

     // Perform validation on each property 
     foreach (var prop in props) 
      ValidateProperty(validationIssues, entity, prop); 

     // Return the list 
     return validationIssues; 
    } 

    protected virtual void ValidateProperty<TEntity>(XLValidationIssues validationIssues, TEntity entity, PropertyInfo property) 
    { 
     // Get list of validator attributes 
     var validators = property.GetCustomAttributes(typeof(ValidationAttribute), true); 
     foreach (ValidationAttribute validator in validators) 
      ValidateValidator(validationIssues, entity, property, validator); 
    } 

    protected virtual void ValidateValidator<TEntity>(XLValidationIssues validationIssues, TEntity entity, PropertyInfo property, ValidationAttribute validator) 
    { 
     var value = property.GetValue(entity, null); 
     if (!validator.IsValid(value)) 
      validationIssues.Add(new XLValidationIssue(property.Name, value, validator.FormatErrorMessage(property.Name, value))); 
    } 
+0

Đây có phải là trong khung 3.5 hoặc 4.0 không? Bạn đang sử dụng trình duyệt xác thực nào? –

+0

Nhận xét hay. Tôi đang sử dụng 3,5 và tôi đang sử dụng một Á hậu xác nhận tùy chỉnh khá đơn giản (đăng mã ở trên). –

Trả lời

7

tôi không thể tìm thấy nhiều trên web về DataType.PhoneNumber, nhưng tôi đã tìm thấy điều này:

http://forums.asp.net/p/1370546/2863383.aspx

Trong phiên bản RTM, các DataType.EmailAddress chỉ được sử dụng để đánh dấu loại dữ liệu cho việc sử dụng của riêng bạn.

Tôi muốn tìm hiểu thêm một chút, vì vậy tôi đã rút ra Phản xạ .NET của Red Gate và bắt đầu đào bới.

Nhìn vào lớp DataTypeAttribute, Joseph Daigle là điểm trên - mỗi thuộc tính DataType không thực hiện bất kỳ xác thực nào; luôn trả về true (nghĩa là "hợp lệ"). Trên một số loại dữ liệu, một số định dạng chuỗi hiển thị tùy chỉnh được thực hiện. Số điện thoại, tuy nhiên, được khá nhiều trái bị ảnh hưởng.

Vì vậy, tôi đã xem xét các giải pháp khả thi cho vấn đề này. Từ những gì tôi đã tìm thấy, this trông ưng ý nhất:

public class EvenNumberAttribute : ValidationAttribute 
{ 
    public EvenNumberAttribute() : base(() => Resource1.EvenNumberError) { } 
    public EvenNumberAttribute(string errorMessage) : base(() => errorMessage) { } 

    protected override ValidationResult IsValid(object value, 
     ValidationContext validationContext) 
    { 
     if (value == null) 
     { 
      return ValidationResult.Success; 
     } 

     int convertedValue; 
     try 
     { 
      convertedValue = Convert.ToInt32(value); 
     } 
     catch (FormatException) 
     { 
      return new ValidationResult(Resource1.ConversionError); 
     } 

     if (convertedValue % 2 == 0) 
     { 
      return ValidationResult.Success; 
     } 
     else 
     { 
      return new ValidationResult(FormatErrorMessage(validationContext.DisplayName)); 
     } 
    } 
} 

Tất nhiên, điều đó xác nhận cho dù một số là số lẻ hay chẵn. Bạn có thể viết thuộc tính xác thực tùy chỉnh cho PhoneNumber, Email, v.v. thực tế là thực hiện xác thực.

+0

Tôi thấy câu hỏi này không được trả lời trong danh sách của tôi và nhận ra rằng bạn đã thực sự trả lời đúng và nó xứng đáng được đánh dấu như vậy. Xin lỗi vì sự chậm trễ lâu dài. –

+0

Không vấn đề gì - vui vì nó đã giúp và cảm ơn bạn :) – Doug

1

Các DataTypeAttribute là một ValidationAttribute. Nhưng nó luôn luôn trả về sự thật ... vì vậy nó không làm bất kỳ xác thực thực sự.

(Tôi biết điều này là đúng cho 3.5, tôi không chắc chắn nếu đó là sự thật cho 4.0)

+0

Tôi khá mới với MVC và đã tự hỏi nếu nó luôn luôn trả về true, tôi có nên đặt loại đó là gì không? Điều này sẽ cải thiện mã của tôi như thế nào? –

+0

DataTypeAttribute không được thiết kế để xác thực. Chú thích dữ liệu chỉ là: các thuộc tính chú thích dữ liệu. Một số được sử dụng để xác nhận, một số khác được sử dụng để chỉ mô tả dữ liệu đại diện cho những gì. –

0

Có lẽ nó vì số điện thoại có thể chứa các chữ cái? wiki

3

Số điện thoại, mã zip phải được xác thực với RegularExpressionAttribute Class

+0

Trừ khi bạn có thể chỉ cho tôi một regex thực sự xác nhận đối với RFC hiện tại, Email CHỈ được xác thực bằng cách gửi email thử nghiệm đến địa chỉ. Tôi bị bệnh và mệt mỏi với các trang web cho tôi biết rằng tôi không thể có "+" trong địa chỉ của tôi hoặc TLD của tôi không hợp lệ. – slipsec