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

Я использую монорельс, 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# без косых черт, но это не так, как кажется.

2 ответа

Решение

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

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

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

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

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

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

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

"user.username": {обязательно: true, regExp: ^[\w ]{4,50}$ }

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

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

Другие вопросы по тегам