Проверка правильности синтаксиса для принятия только числовых номеров месяцев? - PullRequest
0 голосов
/ 18 марта 2010

У меня есть перечисление, определенное так:

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

Тогда валидатор свойства определяется как:

<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")> _

Проверка ожидает "_ #", так как когда я удаляю TypeConversionValidator, она проходит с установкой значения "_3" или любого другого числа в перечислении.

Мне нужно, чтобы для этого принимались только б / т 1-12, и просто числовые значения в перечислении не сработают.

Какие-нибудь советы?

Спасибо.

UPDATE

Я заменил EnumConversionValidator на RangeValidator и пытался установить для параметра значение «1», но получил следующую ошибку:

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

Однако теперь это дает мне следующую ошибку:

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 ....

1 Ответ

0 голосов
/ 20 марта 2010

RangeValidator может обрабатывать только такие примитивные типы, как int, float, double, decimal. Поскольку вы предоставляете целое число в конструкторе, он пытается сопоставить это int с вашим перечислением, что не получится, потому что VAB использует метод Object.Compare(object).

Попробуйте использовать дизайн, в котором вам не нужно определять диапазон номеров как enum. Попробуйте использовать простое целочисленное поле. Намного менее болезненно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...