2

J'ai configuré un ensemble de règles dans mon fichier de configuration qui a deux validateurs, dont l'un est un NotNullValidator intégré, l'autre étant un validateur personnalisé. Le problème est que je vois le hit NotNullValidator, mais pas mon validateur personnalisé.Le validateur personnalisé n'est pas invoqué lors de l'utilisation du bloc d'application de validation via la configuration

Le validateur personnalisé est utilisé pour valider un objet entité Entity Framework.

J'ai utilisé le débogueur pour confirmer que le NotNull est touché (j'ai forcé une condition d'échec, donc je l'ai vu définir un résultat invalide), mais il ne passe jamais dans le custom. J'utilise MVC comme application Web, j'ai donc défini l'ensemble de règles dans un fichier de configuration sur cette couche, mais mon validateur personnalisé est défini dans un autre projet. Cependant, je n'aurais pas pensé que ce soit un problème parce que lorsque j'utilise l'outil de configuration de la bibliothèque d'entreprise dans Visual Studio 2008, il est capable de définir le type correctement pour le validateur personnalisé. De plus, je crois que le validateur personnalisé fonctionne correctement, et l'outil de configuration peut le référencer correctement.

Est-ce que quelqu'un a des idées sur ce que le problème pourrait être, ou même que faire/essayer de déboguer davantage?

Voici une version dépouillée de mon validateur personnalisé:

[ConfigurationElementType(typeof(CustomValidatorData))] 
public sealed class UserAccountValidator : Validator 
{ 
    public UserAccountValidator(NameValueCollection attributes) 
     : base(string.Empty, "User Account") 
    { 
    } 

    protected override string DefaultMessageTemplate 
    { 
     get { throw new NotImplementedException(); } 
    } 

    protected override void DoValidate(object objectToValidate, 
     object currentTarget, string key, ValidationResults results) 
    { 

     if (!currentTarget.GetType().Equals(typeof(UserAccount))) 
     { 
      throw new Exception(); 
     } 

     UserAccount userAccountToValidate = (UserAccount)currentTarget; 

     // snipped code ... 

     this.LogValidationResult(results, 
      "The User Account is invalid", currentTarget, key); 
    } 
} 

Voici le code XML de mon ruleset dans Validation.config (la règle de NotNull est seulement là pour forcer un échec pour que je puisse le voir obtenir a frappé, et il le fait):

<validation> 
<type defaultRuleset="default" assemblyName="MyProj.Entities, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" 
    name="MyProj.Entities.UserAccount"> 
    <ruleset name="default"> 
    <properties> 
     <property name="HashedPassword"> 
     <validator negated="true" messageTemplate="" messageTemplateResourceName="" 
      messageTemplateResourceType="" tag="" type="Microsoft.Practices.EnterpriseLibrary.Validation.Validators.NotNullValidator, Microsoft.Practices.EnterpriseLibrary.Validation, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" 
      name="Not Null Validator" /> 
     </property> 
     <property name="Property"> 
     <validator messageTemplate="" messageTemplateResourceName="" 
      messageTemplateResourceType="" tag="" type="MyProj.Entities.UserAccountValidator, MyProj.Entities, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" 
      name="Custom Validator" /> 
     </property> 
    </properties> 
    </ruleset> 
</type> 
</validation> 

et voici la version dépouillée de la façon dont j'invoque la validation:

   var type = entity.GetType() 
       var validator = ValidationFactory.CreateValidator(type, "default", new FileConfigurationSource("Validation.config")) 
       var results = validator.Validate(entity) 

Un conseil serait grandement apprécié!

Merci,

Chris

Répondre

2

Vous validateur personnalisé ne doit pas être configuré comme une « propriété validateur », mais comme un « auto validateur ». Déplacez le noeud directement sous le noeud dans votre configuration. Cela devrait faire l'affaire.

+0

Excellent, qui était, merci! – Chris

0

pour validateur personnalisé, vous devez définir l'attribut obligatoire du champ que vous configurez le validateur pour « true », i.e. required = « true »

Questions connexes