Проблема ValidateRegExp на стороне клиента и на стороне сервера
-
27-09-2019 - |
Вопрос
Я использую 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, а мое - нет...