2010-08-31 28 views
12

Tôi sẽ giải quyết việc viết ngày xác nhận ngày tùy chỉnh cho một ứng dụng họp đang làm việc tại nơi làm việc sẽ xác nhận nếu ngày bắt đầu hoặc ngày kết thúc đã cho là A) nhỏ hơn ngày hiện tại hoặc B) ngày bắt đầu lớn hơn ngày kết thúc cuộc họp (hoặc ngược lại)..NET MVC Custom Date Validator

Tôi nghĩ đây có lẽ là một yêu cầu khá phổ biến. Bất cứ ai có thể chỉ cho tôi theo hướng của một bài đăng blog có thể giúp tôi trong việc giải quyết vấn đề này?

Tôi đang sử dụng .net 3.5 vì vậy tôi không thể sử dụng api mô hình validator mới xây dựng vào NET 4. Dự án tôi đang làm việc trên là MVC 2.

UPDATE: lớp tôi viết cần mở rộng không gian tên System.ComponentModel.DataAnnotations. Trong .NET 4 có một giao diện IValidateObject mà bạn có thể thực hiện, điều này làm cho loại điều này trở thành một doddle tuyệt đối, nhưng đáng tiếc là tôi không thể sử dụng .Net 4. Làm thế nào để tôi thực hiện tương tự trong .Net 3.5?

+0

Tôi vừa mới được làm việc trên nó. Có lẽ nó sẽ giúp: [CompareDatesValidator] [1] [1]: http://stackoverflow.com/questions/2848684/compare-dates-dataannotations-validation-asp-net-mvc/8070779 # 8070779 – free4ride

+0

Tôi vừa mới làm việc trên đó. Có lẽ nó sẽ giúp: [nhập liên kết mô tả ở đây] [1] [1]: http://stackoverflow.com/questions/2848684/compare-dates-dataannotations-validation-asp-net- mvc/8070779 # 8070779 – free4ride

Trả lời

21
public sealed class DateStartAttribute : ValidationAttribute 
    {   
     public override bool IsValid(object value) 
     { 
      DateTime dateStart = (DateTime)value; 
      // Meeting must start in the future time. 
      return (dateStart > DateTime.Now); 
     } 
    } 

    public sealed class DateEndAttribute : ValidationAttribute 
    { 
     public string DateStartProperty { get; set; } 
     public override bool IsValid(object value) 
     { 
      // Get Value of the DateStart property 
      string dateStartString = HttpContext.Current.Request[DateStartProperty]; 
      DateTime dateEnd = (DateTime)value; 
      DateTime dateStart = DateTime.Parse(dateStartString); 

      // Meeting start time must be before the end time 
      return dateStart < dateEnd; 
     } 
    } 

và trong Xem các mẫu của bạn:

[DateStart] 
public DateTime StartDate{ get; set; } 

[DateEnd(DateStartProperty="StartDate")] 
public DateTime EndDate{ get; set; } 

Trong hành động của bạn, chỉ cần kiểm tra rằng ModelState.IsValid. Đó là những gì bạn đang sau?

+0

Có vẻ khá tốt, tôi không thể kiểm tra nó vào lúc này, nhưng tôi sẽ có thể làm điều đó vào cuối ngày. Cảm ơn! – MrBliz

+0

Trong trường hợp này làm thế nào để tôi nhận các giá trị cho StartDate và EndDate từ mô hình, vì chúng là cả hai giá trị do người dùng nhập? – MrBliz

+0

Đã thay đổi câu trả lời của tôi. :) Vì vậy, kiểm tra StartDate với DateTime.Now. EndDate kiểm tra với StartDate mà người dùng đã nhập để đảm bảo nó sau ngày bắt đầu. –

1

Tôi nghĩ rằng điều này sẽ làm điều đó:

public boolean MeetingIsValid(DateTime start, DateTime end) 
{ 
     if(start < DateTime.Now || end < DateTime.Now) 
      return false; 

     return start > end || end < start; 
} 
+0

Xin cảm ơn, sau khi đọc câu trả lời, tôi nhận ra rằng tôi cần cung cấp thông tin của mình. Tất nhiên mã mà bạn đã cung cấp sẽ xác nhận một ngày, nhưng nó không phải là một phần của vấn đề tôi đã bị mắc kẹt trên. Tôi cần biết các giao diện để thực hiện để mở rộng không gian tên dataannotations. Dù sao cũng cảm ơn bạn. – MrBliz

4

Tôi biết bài đăng này cũ hơn, nhưng, giải pháp này tôi thấy là tốt hơn nhiều.

Giải pháp được chấp nhận trong bài đăng này sẽ không hoạt động nếu đối tượng có tiền tố khi nó là một phần của mô hình chế độ xem.

ví dụ: các dòng

// Get Value of the DateStart property 
string dateStartString = HttpContext.Current.Request[DateStartProperty]; 

Một giải pháp tốt hơn có thể được tìm thấy ở đây: http://www.a2zdotnet.com/View.aspx?Id=182

+0

Chắc chắn là một giải pháp tốt hơn! +1 cho liên kết hữu ích! – DanO

+0

Liên kết chết :-(... – nashwan