2011-03-30 2 views
0

Est-il possible dans ASP.NET MVC pour un CustomValidationAttribute sur un champ de s'exécuter uniquement si un objet CustomValidationAttribute différent valide un champ différent.Attribut de validation personnalisé ASP.NET MVC

Mon affichage doit contenir des champs de date et d'heure distincts. J'ai des attributs de validation personnalisés séparés pour les deux. Mais est-il possible que l'attribut de validation de temps soit vérifié seulement quand l'attribut de validation de date est vrai?

Merci.

+0

Pourquoi voulez-vous faire cela? Si la date et l'heure sont toutes deux invalides, pourquoi ne pas le dire? Ou pourquoi ne pas utiliser la validation côté client pour le faire à la place, qui fera ce que vous voulez? – arame3333

Répondre

3

temps attribut de validation est cochée que lorsque la validation de la date d'attribut valide true?

Cette déclaration signifie une validation personnalisée. Oui, vous pouvez le faire. Vous pouvez définir un attribut de validation personnalisé qui prend le nom d'un autre champ en tant que paramètre. Ensuite, dans la méthode Validate() surchargée, vous pouvez obtenir PropertyInfo pour cet autre champ par le nom, puis obtenir les attributs de validation et les valider. Après avoir obtenu le résultat, vous pouvez décider de faire une validation sur le premier champ ou non. Brad Wilson avait grand poste sur mvcConf sur la validation

Par ailleurs, vous pouvez également mettre en œuvre IClientValidatable pour conclure la validation côté client

Ceci est l'exemple de code très très et il a besoin d'une manipulation de la vérification d'arguments et d'erreurs, etc. Mais je pense que l'idée est claire

public class OtherFieldDependentCustomValidationAttribute : ValidationAttribute 
{ 
    public readonly string _fieldName; 

    public OtherFieldDependentCustomValidationAttribute(string otherFieldName) 
    { 
     _fieldName = otherFieldName; 
    } 

    protected override System.ComponentModel.DataAnnotations.ValidationResult IsValid(object value, System.ComponentModel.DataAnnotations.ValidationContext validationContext) 
    { 
     //Get PropertyInfo For The Other Field 
     PropertyInfo otherProperty = validationContext.ObjectType.GetProperty(_fieldName); 

     //Get ValidationAttribute of that property. the OtherFieldDependentCustomValidationAttribute is sample, it can be replaced by other validation attribute 
     OtherFieldDependentCustomValidationAttribute attribute = (OtherFieldDependentCustomValidationAttribute)(otherProperty.GetCustomAttributes(typeof(OtherFieldDependentCustomValidationAttribute), false))[0]; 

     if (attribute.IsValid(otherProperty.GetValue(validationContext.ObjectInstance, null), validationContext) == ValidationResult.Success) 
     { 
      //Other Field Is valid, do some custom validation on current field 

      //custom validation.... 

      throw new ValidationException("Other is valid, but this is not"); 
     } 
     else 
     { 
      //Other Field Is Invalid, do not validate current one 
      return ValidationResult.Success; 
     } 
    } 
} 
+0

@archil: pouvez-vous donner un pseudo-code? Je ne suis pas capable de te suivre entièrement. – Jake

+0

avez-vous vérifié la vidéo de Brad Wilson que j'ai mentionné? – archil

+0

oui je l'ai fait, cette vidéo est basée sur mvc 3, le projet sur lequel je travaille doit utiliser mvc 2 – Jake

Questions connexes