Проблема ValidateRegExp на стороне клиента и на стороне сервера

StackOverflow https://stackoverflow.com/questions/3464039

Вопрос

Я использую monorail, activerecord и jquery.У меня есть форма с текстовым полем почтового индекса.У меня есть в моей активной записи класс, связанный с формой:

[Property]
        [ValidateNonEmpty]
        [ValidateRegExp(@"/^\d{5}(-\d{4})?$/", "Invalid")]
        public string ZipCode { get; set; }

Как вы можете видеть, я использую атрибут ValidateRegExp, который затем автоматически генерирует правила проверки jQuery.Проблема в том, что регулярные выражения в javascript отличаются от тех, что есть в C #.Javascript требует / до и после регулярного выражения, в то время как C # этого не делает.Если я добавлю косые черты, то проверка jQuery сработает, но если они обойдут проверку javascript и отправят форму с отключенным js (или если кто-то сохранит объект с помощью другого средства, например, тестового примера), то будет указано, что почтовый индекс недействителен, потому что C # не любит косые черты.

Итак, мой вопрос в том, как вы удовлетворяете javascript и C # одним регулярным выражением?Я бы ожидал, что он будет достаточно умен, чтобы добавлять косые черты до и после только для проверки jQuery, чтобы вы могли указать регулярное выражение в C # без косых черт, но, похоже, это не тот случай.

Это было полезно?

Решение

Вы должны определить себя регулярное выражение, без окружающего / персонажи.

Если у вас возникли проблемы с стороной клиента, он поможет, если вы включите ошибку JS, вы видите (если есть), и фактический сгенерированный код JS на странице, который выписан монорельсом на вашу страницу, а также Версия монорельса, которую вы используете.

В качестве бокового примечания давайте посмотрим на код, генерирующий правило проверки JS из атрибута проверки в Jqueryvalidator.cs.

Соответствующий кусок находится в строке 378 (в качестве текущей версии кодовой базы):

           "function(value, element, param) { return new RegExp(param).test(value); }" 

который указывает на то, что new RegExp(expression) используется, а не /expression/ формат. С этим - понятно, что интеграция валидатора JQuery Monorail в порядке.

Другие советы

Я использую jQuery 1.4.2.Не уверен, какую версию MonoRail я использую, в библиотеке dll Castle.MonoRail.Framework указано v2.0.0.0.Однако я обновил его в течение последних 3 месяцев, так что он довольно новый.js, который вы показываете, указывает, что у вас еще более новая версия, чем у меня, поскольку она генерирует для меня следующее (если в выражении ValidateRegExp нет косых черт):

"user.имя пользователя":{обязательно:верно , регулярное выражение:^[\w ]{4,50}$ }

Это, очевидно, приводит к синтаксической ошибке в js, поскольку она не заключена в кавычки или косые черты.В итоге я создал новый валидатор регулярных выражений с AbstractValidator в качестве базового класса, чтобы обойти неисправный класс, который есть в моей версии MonoRail.

Вы не знаете, была ли эта проблема исправлена за последние пару месяцев?В противном случае я не могу объяснить, как ваше генерирует новое регулярное выражение в js, а мое - нет...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top