Динамические элементы управления и валидаторы ASP.NET - невозможно найти идентификатор элемента управления "...", на который ссылается свойство ControlToValidate элемента ... ... - PullRequest
0 голосов
/ 01 декабря 2011

Мне кажется, что на форуме много сообщений / ответов на эту тему, но я не приблизился к решению.

Я загружаю повторяющуюся структуру данных из БД в элементы управления UpdatePanel в обработчике событий.Количество повторов варьируется, поэтому все элементы управления создаются и добавляются на панель контейнера динамически.Пользователь имеет возможность редактировать данные, поэтому я также динамически создаю элементы управления валидатора (RegularExpressionValidator s)

Проблема заключается в установке свойства ControlToValidate валидатора.Независимо от того, как я установил это, я получаю сообщение об ошибке Unable to find control id '...' referenced by the 'ControlToValidate' property of '...' от сервера, которое затем вызывается ASP.NET AJAX JS.

Краткая версия кода добавления элемента управления выглядит следующим образом:

TextBox licenseCode = new TextBox();
licenseCode.ID = this.getNextId();  // generated ID contains only [A-Za-Z], [0-9], :, -, .
licenseCode.MaxLength = 50;
this.purchaseEdit.Controls.Add(licenseCode);  // this.purchaseEdit is an asp:Panel

RegularExpressionValidator licenseCodeVal = new RegularExpressionValidator();
licenseCodeVal.ControlToValidate = licenseCode.ClientID;
licenseCodeVal.ID = this.getNextId();
licenseCodeVal.ValidationGroup = this.purchaseEditSave.ValidationGroup;  // save button within the panel
licenseCodeVal.ValidationExpression = @"^.{1," + licenseCode.MaxLength.ToString() + "}$";
licenseCodeVal.ErrorMessage = "Between 1 and " + licenseCode.MaxLength.ToString() + " chars.";
this.purchaseEdit.Controls.Add(licenseCodeVal);

Как видно, оба элемента управления добавляются в один и тот же контейнер, валидатор добавляется после TextBox, а для свойства ControlToValidate в настоящее время установлено значение ClientID элемента TextBox.Я тоже пробовал значение идентификатора, но без радости.

Действительно раздражает то, что если я не добавлю валидатор и с помощью точки останова проверю ClientID в TextBox, я могу проверить DOMобновите страницу и найдите атрибут ID TextBox:

<input type="text" id="ctl00_ContentBody_PCTL::4890cc3a-8d07-4dee-aa9f-bdd8735fcaf8::licCode"... />

Насколько я могу судить, я не делаю ничего плохого, так почему я получаю эту ошибку ??

Любойпредложения высоко ценится.

Ответы [ 2 ]

0 голосов
/ 02 декабря 2011

ARGH, так что я наконец понял эту вещь - это сводится к специальным символам в ID. У меня возникла проблема с селектором JQuery, который содержал «:», и решил, что мне следует просто проверить, не вызывало ли это проблемы с валидатором - это было.

В конце я создал свои GUID без дефисов и заменил ':' на '_', и проблема исчезла. Этот вопрос помог.

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

0 голосов
/ 01 декабря 2011

Вы не должны использовать ClientID, но ID TextBox.

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.basevalidator.controltovalidate.aspx

«Я тоже попробовал значение идентификатора, но без радости».

Но вы не получили исключения, и только проверка не сработала?!

Мое предложение заключается в том, чтобы обернуть элемент управления и валидатор в UserControl и динамически добавить его в свой контейнерный элемент управления. Таким образом, вы можете использовать идентификаторы исправлений, поскольку все они имеют различные NamingContainers.

Код будет чище. Инкапсуляция также увеличивает возможность повторного использования.

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