2010-08-31 8 views
12

Zajmę się pisaniem jutro niestandardowej klasy walidacji dat dla aplikacji konferencyjnej, nad którą pracuję, która sprawdzi czy dana data początkowa lub końcowa jest A) mniejsza od bieżącej daty lub B) data rozpoczęcia jest większa niż data zakończenia spotkania (lub odwrotnie)..NET MVC Custom Date Validator

Myślę, że jest to prawdopodobnie dość powszechny wymóg. Czy ktoś może wskazać mi kierunek posta na blogu, który mógłby mi pomóc w rozwiązaniu tego problemu?

Używam .NET 3.5, więc nie mogę korzystać z nowego API modelu validator wbudowany w .NET 4. Projekt pracuję nad jest MVC 2.

UPDATE: klasy I jestem pisanie wymaga rozszerzenia przestrzeni nazw System.ComponentModel.DataAnnotations. W .NET 4 istnieje interfejs IValidateObject, który można zaimplementować, co sprawia, że ​​tego rodzaju rzeczy to absolutne doddle, ale niestety nie mogę używać .Net 4. Jak mam zrobić to samo w .Net 3.5?

+0

Właśnie pracuję nad tym. Może to pomoże: [CompareDatesValidator] [1] [1]: http://stackoverflow.com/questions/2848684/compare-dates-dataannotations-validation-asp-net-mvc/8070779 # 8070779 – free4ride

+0

Właśnie nad tym pracowałem. Może to pomoże: [enter Opis Link tutaj] [1] [1]: http://stackoverflow.com/questions/2848684/compare-dates-dataannotations-validation-asp-net- mvc/8070779 # 8070779 – free4ride

Odpowiedz

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

i w widoku modelu:

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

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

W swoim działaniu, wystarczy sprawdzić, że ModelState.IsValid. Tego właśnie szukasz?

+0

Wygląda całkiem nieźle, nie mogę go przetestować w tej chwili, ale będę mógł to zrobić do końca dnia. Dzięki! – MrBliz

+0

W takim przypadku, w jaki sposób mogę pobrać wartości dla StartDate i EndDate z modelu, ponieważ są one wartościami wprowadzonymi przez użytkownika? – MrBliz

+0

Zmieniono moją odpowiedź. :) Więc czeki StartDate z DateTime.Now. EndDate sprawdza przy pomocy StartDate, który został wprowadzony przez użytkownika, aby upewnić się, że jest po dacie rozpoczęcia. –

1

myślę, że to powinno wystarczyć:

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

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

Cześć dzięki, po przeczytaniu odpowiedzi uświadomiłem sobie, że muszę podać moją informację. Oczywiście podany kod potwierdzi datę, ale nie była to część problemu, na którym utknąłem. Musiałem wiedzieć, jakie interfejsy wprowadzić, aby rozszerzyć przestrzeń nazw danychanałowych. Dzięki i tak. – MrBliz

4

Wiem, że ten post jest starszy, ale to rozwiązanie, które znalazłem, jest znacznie lepsze.

Przyjęte rozwiązanie w tym poście nie będzie działać, jeśli obiekt ma prefiks, gdy jest częścią viewmodelu.

tj linie

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

lepsze rozwiązanie można znaleźć tutaj: http://www.a2zdotnet.com/View.aspx?Id=182

+0

Zdecydowanie lepsze rozwiązanie! +1 za pomocny link! – DanO

+0

Dead link :-(... – nashwan