2013-05-29 2 views
0

Je l'ai regardé tant d'exemples, et je suis en train de faire comme ils suggèrent tous, mais je continue à obtenir une InvliadCastException avec la description d'erreur:Parsing Chaîne à DateTime avec TryParseExact en C#

Impossible de jeter l'objet de type 'System.DateTime' taper 'System.String'

Je reçois ma date d'un champ Date du texte de naissance dans une application ASP.NET MVC4, dans le format suivant 20/09/1986

ici est mon code, je veux seulement les utilisateurs a 18 ans pour pouvoir s'inscrire.

public class AgeValidator : ValidationAttribute 
{ 
    public override bool IsValid(object value) 
    { 
     string format = "dd/MM/yyyy HH:mm:ss"; 
     DateTime dt; 
     DateTime.TryParseExact((String)value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out dt); 


     DateTime today = DateTime.Today; 
     int age = today.Year - dt.Year; 
     if (dt > today.AddYears(-age)) age--; 

     if (age < 18) 
     { 
      return false; 
     } 

     return true; 
    } 
} 

Ma validation personnalisée est alors utilisée comme ceci:

[Required] 
[Display(Name = "Date Of Birth")] 
[AgeValidator(ErrorMessage="You need to be at least 18 years old to vote.")] 
public DateTime DateOfBirth { get; set; } 

Comment puis-je obtenir le DateTime analysé correctement?

+2

L'erreur indique que 'value' est déjà un objet' DateTime' – leppie

+2

'value' est déjà un DateTime. –

+0

Je pensais que tout ce qui venait d'un formulaire http était une chaîne? Ou le classeur a-t-il fait un travail intelligent pour moi? :/ – Ciwan

Répondre

1

Cela sonne comme un bon endroit pour utiliser des méthodes surchargées:

public override bool IsValid(DateTime value) 
{ 
    DateTime today = DateTime.Today; 
    int age = today.Year - value.Year; 
    if (value > today.AddYears(-age)) age--; 

    if (age < 18) 
    { 
     return false; 
    } 

    return true; 
} 

public override bool IsValid(string value) 
{ 
    string format = "dd/MM/yyyy HH:mm:ss"; 
    DateTime dt; 
    if (DateTime.TryParseExact((String)value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out dt)) 
    { 
     return IsValid(dt); 
    } 
    else 
    { 
     return false; 
    } 

} 

public override bool IsValid(object value) 
{ 
    return IsValid(value.ToString()); 
} 
0

Vous pouvez vérifier si votre object value est de type DateTime avant d'essayer de l'analyser à DateTime:

if(value == null) 
{ 
    throw new ArgumentNullException("value"); 
} 
DateTime dt ; 
if(value is DateTime) 
{ 
    dt = (DateTime)value; 
} 
else 
{ 
    string format = "dd/MM/yyyy HH:mm:ss"; 
    DateTime.TryParseExact(value.ToString(), format, CultureInfo.InvariantCulture, DateTimeStyles.None, out dt); 
} 
//rest of your code