2011-02-02 10 views
5

In un'app di Asp.net MVC, ho ereditato questo problema (se si tratta di un problema?) In cui uno sviluppatore ha utilizzato String per il tipo Data.Come convalidare la data quando si usa `String` invece di un tipo` Date`?

Nel mio modello la proprietà si legge:

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

Il business requisito è che il campo è non necessaria, ma se c'è qualcosa in quel campo allora deve essere una valida data .

Come ti implementare questo requisito, senza modificare il tipo di dati?

+1

Probabilmente fare qualcosa lungo le linee di attuazione di un controllo utilizzando DateTime.TryParse nel metodo setter – Rob

risposta

8

It looks like you're utilizzando System.ComponentModel.DataAnnotations. Il modo migliore per farlo utilizzando questa libreria sarebbe creare un nuovo attributo per convalidare le stringhe di data e applicarlo alla proprietà. Ecco un po 'di codice per iniziare con:

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

Probabilmente desidera espandere su questo codice a seconda del tipo di stringhe vi aspettate dal client. Inoltre, questo non ti darà alcuna convalida sul lato client.

+0

+1 per il link "Sembra che tu sia", reso il mio giorno – Rob

+0

+1: hai perfettamente ragione che sto usando DataAnnotations e speravo in qualcosa di simile a questo tipo di soluzione. Ho intenzione di provarlo questa sera. – VoodooChild

+0

ha funzionato come un incantesimo - grazie! – 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 grazie, questo non è un cattivo approccio. Ma come faccio a mostrare questo come errori di validazione in un'app MVC? +1 – VoodooChild

1

(specie di) pseudocodice:

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

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

Che ne dici di un'espressione regolare? Annotazioni dati ha un attributo regex. Ora dovresti correggere su un formato, ad esempio ISO (aaaa/mm/gg) che potrebbe non soddisfare le tue esigenze.

Un'altra alternativa potrebbe essere creare la propria annotazione.

Un'altra soluzione potrebbe utilizzare un datetime nullable (DateTime?). Non sono sicuro di come verrebbe gestito, quindi sarebbero necessari alcuni tentativi ed errori. Tuttavia ha solo bisogno di aggiungerne uno? quindi potrebbe essere relativamente facile da provare.

Simon

Problemi correlati