Проверка правильности регулярного выражения () приводит к NullReference (ASP.NET) - PullRequest
0 голосов
/ 26 августа 2009

У меня проблемы с использованием средства проверки регулярных выражений ASP.NET для текстовых полей. Это сокращенная версия моего кода:

RegularExpressionValidator regex = new RegularExpressionValidator();
regex.ID = "TextBoxRegExValidator" +        ((AVPEditControl)avpControl).ThisFieldRID.ToString(); //random name
regex.ControlToValidate = ((AVPEditControl)avpControl).TextControlID; //this is valid.
regex.ValidationExpression = "\d{3}-\d{2}-\d{4}";
regex.Text = "epic fail";
//later, in an event handler
regex.Display = ValidatorDisplay.None;
regex.ErrorMessage = "";
regex.Validate(); //ERROR
bool valid = AVPEdit.Validator.IsValid;

Где я отметил "ОШИБКА" Это где я получаю исключение NullReferenceException. Я не вижу, чего мне здесь не хватает, потому что я подтвердил с помощью отладчика, что регулярное выражение не является нулевым в этом контексте, равно как и элемент управления, который он проверяет.

Я хотел бы иметь более точный контроль над отображением сообщения об ошибке, поэтому я решил не привязывать регулярные выражения к каким-либо панелям или тому подобное.

Почему я мог бы получить нулевую ссылку от этого? (Это ошибка в .NET?)

Также обратите внимание, что это работает, когда я устанавливаю Visible в 0, но это делает его таким, что IsValid всегда имеет значение true.

Ответы [ 3 ]

2 голосов
/ 26 августа 2009

Все валидаторы ASP.NET должны быть частью страницы, чтобы функционировать.Вы заметите, что метод Validate не возвращает значение;это потому, что он не предназначен для использования так, как вы его используете.

Внутри метода Validate он пытается найти элемент управления по его идентификатору, и без родительского контейнера именования он не может это сделать.То, как вы это делаете, не имеет значения для проверки (потому что он не сможет найти элемент управления).

Я бы сделал одно из следующего:

1) Поместите валидатор в ASPX, затем используйте его метод Validate и впоследствии проверьте свойство IsValid.Просто установите для параметра Дисплей значение Нет, и оно не должно отображаться в вашем пользовательском интерфейсе.

2) Просто запустите регулярное выражение вручную.Вы пишете здесь намного больше кода, чем было бы необходимо, если бы вы просто использовали Regex.IsMatch.

(Обратите внимание, что если вы используете Reflector, перейдите к RegularExpressionValidator, вы увидите, где он будет пытаться вызватьto this.NamingContainer среди прочего, который будет нулевым, не будучи частью коллекции элементов управления)

1 голос
/ 26 августа 2009

Я думаю, вы должны добавить его в свою коллекцию элементов управления, возможно, внутри невидимого элемента управления div, чтобы заставить его работать.

Но если вы хотите проверить текстовое поле программно, почему бы вам просто не написать метод, который использует ваш шаблон для проверки управления и возвращает достоверность?

0 голосов
/ 26 августа 2009

Я думаю, что если вы хотите использовать код для проверки, вы можете использовать что-то вроде этого

Match m = Regex.Match(yourtext,"\d{3}-\d{2}-\d{4}")

if(m.Success)
{
//valid
}

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