2011-02-02 10 views
5

W aplikacji Asp.net MVC, odziedziczyłem ten problem (jeśli jest to problem?), W którym jeden programista użył String dla typu daty.Jak sprawdzić datę użycia `String` zamiast` Date` type?

W moim modelu własnością brzmi:

wymóg
[Required] 
[DisplayName("Registration Date")] 
public string Registrationdate { get; set; } 

Przedmiotem działalności jest to, że pole jest nie wymagane, ale jeśli jest coś w tym pól to musi być ważny data.

Jak zrealizować to wymaganie, bez zmiany typu danych?

+1

Prawdopodobnie zrobić coś na wzór realizacji czeku za pomocą DateTime.TryParse w setter – Rob

Odpowiedz

8

It looks like you're użyciu System.ComponentModel.DataAnnotations. Najlepszym sposobem na to przy użyciu tej biblioteki byłoby utworzenie nowego atrybutu do sprawdzania ciągów dat i stosowania go do właściwości. Oto niektóre kodu, aby rozpocząć:

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

Pewnie chcesz rozszerzyć na ten kod w zależności od rodzaju strun czekasz od klienta. Ponadto nie zapewni to żadnej walidacji po stronie klienta.

+0

+1 za link "Wygląda jak ty", sprawił, że mój dzień – Rob

+0

+1: masz absolutną rację, że używam DataAnnotations i miałem nadzieję na coś podobnego do tego typu rozwiązania. Spróbuję tego dziś wieczorem. – VoodooChild

+0

działał jak czar - dzięki! – 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 dzięki, to nie jest złe podejście. Ale jak pokazać to jako błędy sprawdzania poprawności w aplikacji MVC? +1 – VoodooChild

1

(rodzaj) pseudokod:

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

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

Co powiesz na wyrażenie regularne? Adnotacje danych mają atrybut regex. Teraz musisz naprawić format, na przykład ISO (rrrr/mm/dd), który może nie spełniać twoich wymagań.

Inną alternatywą może być utworzenie własnej adnotacji.

Jeszcze inne rozwiązanie może używać zerowalnej daty i godziny (DateTime?). Nie jestem pewien, jak by to się stało, więc potrzebna byłaby próba i błąd. Czy to jednak wymaga tylko jednego? więc można go stosunkowo łatwo wypróbować.

Simon

Powiązane problemy