web-dev-qa-db-fra.com

DateTime (date et heure) Validation avec annotation de données

J'ai le code suivant:

        [DisplayName("58.Date and hour of birth")]
        [DataType(DataType.DateTime, ErrorMessage = "Please enter a valid date in the format dd/mm/yyyy hh:mm")]
        [Range(typeof(DateTime), "1/1/2011", "1/1/2016")]
        [RequiredToClose]
        public object V_58 { get; set; }

Je veux forcer l'inclusion du temps (au format HH: mm) et non seulement la date. Ce code considère le 1/1/2011 comme valide quand il ne devrait pas que cela ne contiendrait pas l'heure, tout indique comment exprimer le format correct? (jj/mm/yyyy hh: mm)

19
Marc

Vous pouvez écrire votre propre ValidationAttribute et décorer la propriété avec elle. Vous remplacez la méthode IsValid avec votre propre logique.

public class MyAwesomeDateValidation : ValidationAttribute
{
    public override bool IsValid(object value)
    {
        DateTime dt;
        bool parsed = DateTime.TryParse((string)value, out dt);
        if(!parsed)
            return false;

        // eliminate other invalid values, etc
        // if contains valid hour for your business logic, etc

        return true;
    }
}

Et enfin, décorer votre propriété:

[MyAwesomeDateValidation(ErrorMessage="You were born in another dimension")]
public object V_58 { get; set; }

Remarque: Soyez méfiant des attributs de validation multiples sur vos propriétés, car la commande dans laquelle ils sont évalués ne peuvent pas être déterminés sans plus de personnalisation, puis si la logique de validation se chevauche, vos messages d'erreur ne peuvent décrire pas exactement ce que vous voulez dire exactement ce que vous voulez dire exactement avec la propriété (ouais, c'est une phrase de course)

28
David Fox

Enfin résolu avec une validation personnaliséeAttribute:

public class DateTimeValidation : RegularExpressionAttribute {
    public DateTimeValidation()
        : base(@"^((((31\/(0?[13578]|1[02]))|((29|30)\/(0?[1,3-9]|1[0-2])))\/(1[6-9]|[2-9]\d)?\d{2})|(29\/0?2\/(((1[6-9]|[2-9]\d)?(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))|(0?[1-9]|1\d|2[0-8])\/((0?[1-9])|(1[0-2]))\/((1[6-9]|[2-9]\d)?\d{2})) (20|21|22|23|[0-1]?\d):[0-5]?\d$") {
        ErrorMessage = "Date must be in the format of : dd/mm/yyyy hh:mm";
    }
}
4
Marc

Cette solution ne permet pas de saisir l'heure de saisie 00.00, mais fonctionnera avec une autre valeur.

public class TimeRequiredAttribute : ValidationAttribute
{
    protected override IsValid(object value)
    {
        DateTime result;
        bool parsed = DateTime.TryParse((string)value, out result);
        if(!parsed && DateTime.MinValue.TimeOfDay == result.TimeOfDay)
        {
           return false;
        }
        return true;
    }
}

Mais cela ne fonctionnera qu'avec la structure de la protestation.

0
Alex Shkor

Si vous venez de passer la date dans une chaîne, il le considérera à 12h00. Si vous souhaitez passer du temps dans une chaîne, utilisez la syntaxe "06/06/2011 à 19h00".

D'autres travaux de contournement seraient à conserver votre chaîne tel quel, le convertir en DateTime, puis addhours et/ou addminutes à l'objet DateTime en fonction de vos besoins.

0
User_1983