2011-02-02 29 views
5

Trong ứng dụng Asp.net MVC, tôi đã thừa hưởng sự cố này (nếu đó là sự cố?) Trong đó một nhà phát triển đã sử dụng String cho loại Ngày.Làm cách nào để xác thực ngày khi sử dụng `Chuỗi` thay vì kiểu` Ngày`?

Trong mô hình của tôi tài sản lần đọc:

yêu cầu
[Required] 
[DisplayName("Registration Date")] 
public string Registrationdate { get; set; } 

Việc kinh doanh là lĩnh vực này là không bắt buộc, nhưng nếu có cái gì đó trong các lĩnh vực mà sau đó nó phải là một ngày hợp lệ.

Làm cách nào để bạn triển khai yêu cầu này, mà không thay đổi loại dữ liệu?

+1

lẽ sẽ làm điều gì đó dọc theo dòng thực hiện một kiểm tra sử dụng DateTime.TryParse trong phương thức setter – Rob

Trả lời

8

It looks like you're sử dụng System.ComponentModel.DataAnnotations. Cách tốt nhất để thực hiện việc này bằng thư viện này là tạo thuộc tính mới để xác thực chuỗi ngày và áp dụng nó cho thuộc tính. Dưới đây là một số mã để bạn có thể bắt đầu với:

[AttributeUsage(AttributeTargets.Property, Inherited = true)] 
class DateAttribute : ValidationAttribute 
{ 
    public override bool IsValid(object value) 
    { 
     var dateString = value as string; 
     if (string.IsNullOrWhiteSpace(dateString)) 
     { 
      return true; // Not our problem 
     } 
     DateTime result; 
     var success = DateTime.TryParse(dateString, out result); 
     return success; 
    } 

Bạn có lẽ sẽ muốn mở rộng trên mã này tùy thuộc vào loại dây bạn đang mong đợi từ khách hàng. Ngoài ra, điều này sẽ không cung cấp cho bạn bất kỳ xác thực phía máy khách nào.

+0

+1 cho liên kết "Có vẻ như bạn", đã làm cho ngày của tôi – Rob

+0

+1: bạn hoàn toàn đúng rằng tôi đang sử dụng DataAnnotations và đang hy vọng điều gì đó tương tự như loại giải pháp này. Tôi sẽ thử buổi tối này. – VoodooChild

+0

hoạt động như một sự quyến rũ - cảm ơn! – VoodooChild

7
public string Registrationdate { 
    get; 
    set { 
     DateTime date; 
     var isDate = DateTime.TryParse(value, out date); 
     if (isDate) { 
      _registrationDate = value; 
     } 
     else { 
      // Throw exception 
     } 
    } 
} 
+0

Ok cảm ơn, đây không phải là một cách tiếp cận xấu. Nhưng làm cách nào để hiển thị lỗi này dưới dạng lỗi xác thực trong ứng dụng MVC? +1 – VoodooChild

1

(loại) giả:

if (Registrationdate is not empty) 
{ 
    RegistrationDateTime = new DateTime(Registrationdate); 

    if (RegistrationDateTime is not valid DateTime) 
     fail validation; 
} 
0

Biểu thức chính quy như thế nào? Chú thích dữ liệu có thuộc tính regex. Bây giờ bạn phải sửa định dạng, nói ISO (yyyy/mm/dd) có thể không đáp ứng yêu cầu của bạn.

Một giải pháp thay thế khác có thể là tạo chú thích của riêng bạn.

Một giải pháp khác có thể sử dụng datetime không có giá trị (DateTime?). Tôi không chắc chắn như thế nào sẽ được xử lý mặc dù, do đó, một số thử nghiệm và lỗi sẽ là cần thiết. Nó tuy nhiên chỉ cần bổ sung một? vì vậy có thể tương đối dễ dàng để thử.

Simon

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