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")]
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;
}
}
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);
}
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
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.cs
Application_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">