web-dev-qa-db-fra.com

DateHeure constante en C #

Je voudrais mettre une date constante dans un paramètre d'attribut, comment puis-je créer une date/heure constante? Elle est liée à une ValidationAttribute du bloc d'application de validation EntLib mais s'applique également à d'autres attributs.

Quand je fais ça:

private DateTime _lowerbound = new DateTime(2011, 1, 1);
[DateTimeRangeValidator(_lowerbound)]

J'aurais:

An object reference is required for the non-static field, method, or property _lowerbound

Et en faisant ça

private const DateTime _lowerbound = new DateTime(2011, 1, 1);
[DateTimeRangeValidator(_lowerbound)]

J'aurais:

Le type 'System.DateTime' ne peut pas être déclaré const

Des idées? Aller de cette façon n'est pas préférable:

[DateTimeRangeValidator("01-01-2011")]
43
Bernoulli IT

La solution que j'ai toujours lue est de suivre l'itinéraire d'une chaîne ou de transmettre le jour/mois/année en tant que trois paramètres distincts, car C # ne prend actuellement pas en charge une valeur littérale DateTime.

Voici un exemple simple qui vous permettra de passer soit trois paramètres de type int, soit une string dans l'attribut:

public class SomeDateTimeAttribute : Attribute
{
    private DateTime _date;

    public SomeDateTimeAttribute(int year, int month, int day)
    {
        _date = new DateTime(year, month, day);
    }

    public SomeDateTimeAttribute(string date)
    {
        _date = DateTime.Parse(date);
    }

    public DateTime Date
    {
        get { return _date; }
    }

    public bool IsAfterToday()
    {
        return this.Date > DateTime.Today;
    }
}
21
Jerad Rose

Comme le notent certaines des réponses précédentes, un const DateTime n'est pas pris en charge de manière native en C # et ne peut pas être utilisé comme paramètre d'attribut. Néanmoins, un readonly DateTime (recommandé sur const dans Effective C #, 2e édition [élément 2]) constitue une solution de contournement simple pour les autres situations suivantes:

public class MyClass
{
    public static readonly DateTime DefaultDate = new DateTime(1900,1,1);
}
34
Jonathan

DateTimeRangeValidator peut prendre une représentation de chaîne (format ISO8601) en tant que paramètre

par exemple

                            LowerBound              UpperBound
[DateTimeRangeValidator("2010-01-01T00:00:00",  "2010-01-20T00:00:00")]

Un seul paramètre sera interprété comme UpperBound vous aurez donc besoin de 2 si vous voulez entrer un LowerBound. Vérifiez la documentation pour voir s'il existe une valeur spéciale 'ne vous souciez pas' pour UpperBound ou si vous devez la définir à une date ultérieure très éloignée.

Oups, juste relire et remarqué 

"Aller de cette façon n'est pas préférable"

[DateTimeRangeValidator("01-01-2011")]

Pourquoi pas?

Aurait

private const string LowerBound = "2010-01-01T00:00:00";
private const string UpperBound = "2010-01-20T00:00:00";

[DateTimeRangeValidator(LowerBound, UpperBound)]

être pire/différent de (format littéral de date VB)

private const DateTime LowerBound = #01/01/2000 00:00 AM#;
private const DateTime UpperBound = #20/01/2000 11:59 PM#;

[DateTimeRangeValidator(LowerBound, UpperBound)]

hth
Alan

4
AlanT

Une solution consiste à scinder la date en champs de jour, mois et année, puis à la prolonger RangeAttribute De cette manière, vous obtenez tous les avantages de la validation intégrée.

Voir exemple ci-dessous:

public class PermittedYearRangeAttribute : RangeAttribute
{
    public PermittedYearRangeAttribute()
        : base(1900, DateTime.Now.AddYears(-50).Year)
    {
        ErrorMessage = string.Format("Year must be between 1900 and {0}", DateTime.Now.AddYears(-50).Year);
    }
}

Dans la méthode Global.asax.csApplication_Start(), ajoutez la ligne suivante

DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(PermittedYearRangeAttribute), typeof(RangeAttributeAdapter));

Dans le modèle Décorer les propriétés:

    [Required(ErrorMessage = "Please enter year")]
    [PermittedYearRange]
    public int Year { get; set; }

    [Required(ErrorMessage = "Please enter day")]
    [Range(1, 31, ErrorMessage = "Day must be between 1 and 31")]
    public int Day { get; set; }

    [Required(ErrorMessage = "Please enter month")]
    [Range(1, 31, ErrorMessage = "Month must be between 1 and 12")]
    public int Month { get; set; }

Rendu HTML:

 <input class="tooltip form-control input dob--input input-validation-error" data-val="true" data-val-number="The field Year must be a number." data-val-range="Year must be between 1900 and 1965" data-val-range-max="1965" data-val-range-min="1900" data-val-required="Please enter year" id="Year" maxlength="4096" name="Year" placeholder="YYYY" tabindex="" type="text" value="0">
0
Matas Vaitkevicius