2010-01-19 6 views
1

de Disons que je suis les classes suivantes:.Net - DataAnnotations - Valider 2 DateTime dépendant

public class Post 
{ 
    public Date BeginDate { get; set; } 

    [Validate2Date(BeginDate, EndDate, ErrorMessage = "End date have to occurs after Begin Date")] 
    public Date EndDate { get; set; } 
} 

public class Validate2Dates : ValidationAttribute 
{ 
    public Validate2Dates(DateTime a, DateTime b) 
    { ... } 

    public override bool IsValid(object value) 
    { 
     // Compare date and return false if b < a 
    } 
} 

Mon problème est de savoir comment utiliser mes Validate2Dates personnalisés attribut parce que je ne peux pas le faire:

[Validate2Date(BeginDate, EndDate, ErrorMessage = "End date have to occurs before Begin Date")] 

j'ai eu l'erreur suivante:

An object reference is required for the non-static field, method, or property '...Post.BeginDate.get' C:...\Post.cs

Répondre

0

Vous ne pouvez pas utiliser un attribut comme ça. Les paramètres d'attribut sont limités à des valeurs constantes. Imo la meilleure solution serait de fournir une méthode sur votre classe qui implémente cette vérification et peut être appelée via une interface de validation de la logique métier de votre choix.

+0

Totalement en désaccord. Vous ne pouvez pas utiliser un attribut de validation spécifiquement tel qu'il est écrit ci-dessus, c'est correct. Cependant, le problème qu'il tente de résoudre est parfaitement traité en utilisant des attributs de validation. Vous avez raison, je crois, en ce sens qu'il est judicieux d'intégrer la logique de validation elle-même dans un composant réutilisable, vous pouvez ensuite utiliser ce composant dans un attribut de validation et le brancher simplement sur le reste des notifications de données machinerie. – nerraga

0

La réponse est oui, vous pouvez faire ce que vous essayez de faire, mais pas la façon dont vous le faites actuellement. (Soit dit en passant, je viens de remarquer que cette question a été très bien répondu déjà si je pensais au moins laisser tomber une référence rapide à elle.)

Basé sur le lien ci-dessus ...

  1. Vous « ll besoin d'écrire un validateur personnalisé (que vous avez déjà fait)
  2. vous aurez besoin pour décorer votre modèle au niveau classe, pas le niveau de la propriété
  3. vous ne comptez pas utiliser les propriétés elles-mêmes en tant que paramètres - à la place, vous les référencerez simplement comme des chaînes à rechercher. vi une réflexion

[Validate2Date(BeginDate, EndDate, ...

devient

[Validate2Date(StartDate = "BeginDate", EndDate = "EndDate", ...

Vous pourrez ensuite passer outre IsValid() et réfléchir sur les propriétés nécessaires pour effectuer la comparaison. From the link

.... 
     var properties = TypeDescriptor.GetProperties(value); 
     object originalValue = properties.Find(OriginalProperty, true /* ignoreCase */).GetValue(value); 
     object confirmValue = properties.Find(ConfirmProperty, true /* ignoreCase */).GetValue(value); 
     return Object.Equals(originalValue, confirmValue); 
....