RegularExpressionValidator не обнаруживает пустые строки

У меня есть следующий набор регулярных выражений как свойство ValidationExpression в элементе RegularExpressionValidator в веб-форме. Когда я вводил недопустимый символ в проверяемом элементе управления, валидатор обнаруживает его и показывает сообщение об ошибке.

<appSettings>
  <add key="categoryPattern" value="^[a-zA-Z0-9_+\-() ]{1,50}$" />
</appSettings>

Мой валидатор:

<asp:RegularExpressionValidator ValidationExpression="<%$ AppSettings:categoryPattern %>"

Моя проверка на стороне сервера:

Regex rex = new Regex(ConfigurationManager.AppSettings["categoryPattern"]);
if (!rex.Match(categoryName).Success)
{
    throw new ArgumentException("CategoryName must match expression: " + rex);

Как вы можете видеть, точно такая же модель применяется на стороне клиента и на стороне сервера.

Однако, когда я очищаю проверенный элемент управления и отправляю пустую строку, валидатор считает это ОК, и я получаю сообщение об ошибке на моей стороне. Кто-нибудь знает, что здесь не так, за исключением нарушенного контракта RegularExpressionValidator?

Ответ 1

Это по дизайну. Вы также должны добавить RequiredFieldValidator, чтобы принудительно ввести пользователя. RegularExpressionValidator принимает пустые поля как действительные (и даже не запускает их через Regex). Причина этого заключается в том, что, например, у вас может быть необязательное поле Email address 2 в форме, которая не требуется, но если она была введена, она должна быть действительным адресом электронной почты. Чтобы добиться этого легко, другие валидаторы игнорируют пустые поля, и если вам нужно сделать их необходимыми, вы просто добавите еще один RequiredFieldValidator.

На самом деле не требуется вручную обновлять на сервере. Валидаторы ASP.NET также поддерживают проверку на стороне сервера. Вы можете просто проверить свойство Page.IsValid.