2010-03-18 7 views
0

J'ai un ENUM défini comme tel:Validation Entlib à la syntaxe pour n'accepter que des nombres de mois numériques?

Private Enum AllowedMonthNumbers 
    _1 
    _2 
    _3 
    _4 
    _5 
    _6 
    _7 
    _8 
    _9 
    _10 
    _11 
    _12 
End Enum 

Puis un validateur de propriété définie comme:

<TypeConversionValidator(GetType(Int32), MessageTemplate:="Card expiry month must be numeric.", Ruleset:="CreditCard")> _ 
<EnumConversionValidator(GetType(AllowedMonthNumbers), MessageTemplate:="Card expiry month must be between 1 and 12.", Ruleset:="CreditCard")> _ 

La validation attend "_ #", comme lorsque je retire la TypeConversionValidator, il passe avec la valeur "_3" ou tout autre nombre dans l'énumération. Ce dont j'ai besoin est que ceci n'accepte que b/t 1-12, et avoir simplement des valeurs numériques dans l'énumération ne fonctionnera pas.

Des conseils?

Merci.

MISE À JOUR

J'ai remplacé le EnumConversionValidator avec un RangeValidator, et de tenter de régler le paramètre sur « 1 », mais a reçu l'erreur suivante:

<RangeValidator(1, RangeBoundaryType.Inclusive, 12, RangeBoundaryType.Inclusive, MessageTemplate:="..."> 

Quoi qu'il me donne maintenant l'erreur suivante:

System.Web.Services.Protocols.SoapException : System.Web.Services.Protocols.SoapException: Server was unable to process request. ---> System.ArgumentException: Object must be of type Int32. 
    at System.Int32.CompareTo(Object value) 
    at Microsoft.Practices.EnterpriseLibrary.Validation.Validators.RangeChecker`1.IsInRange(T target) 
    at Microsoft.Practices.EnterpriseLibrary.Validation.Validators.RangeValidator`1.DoValidate(T objectToValidate, Object currentTarget, String key, ValidationResults validationResults) 
    at Microsoft.Practices.EnterpriseLibrary.Validation.Validator`1.DoValidate(Object objectToValidate, Object currentTarget, String key, ValidationResults validationResults) 
    at Microsoft.Practices.EnterpriseLibrary.Validation.Validators.AndCompositeValidator.DoValidate(Object objectToValidate, Object currentTarget, String key, ValidationResults validationResults) 
    at Microsoft.Practices.EnterpriseLibrary.Validation.Validators.ValueAccessValidator.DoValidate(Object objectToValidate, Object currentTarget, String key, ValidationResults validationResults) 
    at Microsoft.Practices.EnterpriseLibrary.Validation.Validators.AndCompositeValidator.DoValidate(Object objectToValidate, Object currentTarget, String key, ValidationResults validationResults) 
    at Microsoft.Practices.EnterpriseLibrary.Validation.Validators.GenericValidatorWrapper`1.DoValidate(T objectToValidate, Object currentTarget, String key, ValidationResults validationResults) 
    at Microsoft.Practices.EnterpriseLibrary.Validation.Validator`1.Validate(T target, ValidationResults validationResults) 
    at Microsoft.Practices.EnterpriseLibrary.Validation.Validation.Validate[T](T target, String[] rulesets) 
    at .... 

Répondre

0

Le RangeValidator ne peut gérer les types primitifs comme int, float, double, décimal. Parce que vous fournissez un entier dans le constructeur, il essaie de faire correspondre cet entier à votre énumération, ce qui échouera, car VAB utilise la méthode Object.Compare(object). Essayez d'utiliser une conception dans laquelle vous n'avez pas besoin de définir une plage de nombres comme énumération. Essayez d'utiliser un simple champ entier à la place. Beaucoup moins douloureux.