Необходимость вызова .ClientID для получения .ID для заполнения для веб-элемента управления - PullRequest
0 голосов
/ 30 июля 2009

Я делаю фреймворк форм для проекта и обнаружил, что при попытке программно установить свойство AssociatedControlID атрибута asp: Label для связанного с ним TextBox, я должен вызвать ClientID чтобы получить ID для заполнения (не быть нулевым).

Во время отладки это использование промежуточного окна показывает проблему:

_inputTextBox.ID
null
_inputTextBox.ClientID
"ctl00_MainContent_ctl01"
_inputTextBox.ID
"ctl01"

(значение присутствует во второй раз ID вызывается)

Я устанавливаю _inputLabel.AssociatedControlID = _inputTextBox.ID в переопределенном CreateChildControls () и пробовал в RenderContents () моего WebControl.

Я попытался загрузить ClientID в первую очередь неиспользуемой временной переменной, и это работает, например:

var x = _inputTextBox.ClientID;
_inputLabel.AssociatedControlID = _inputTextBox.ID;

Дает: (правильно)

<label for="ctl00_MainContent_ctl01">Name of customer</label>
<input type="text" id="ctl00_MainContent_ctl01" name="ctl00$MainContent$ctl01"/>

Вместо: (неверно)

<span>Name of customer</span>
<input type="text" id="ctl00_MainContent_ctl01" name="ctl00$MainContent$ctl01"/>

У меня вопрос - зачем мне этот хак? Есть ли лучший способ для надежного заполнения ID ?

Спасибо.

Ответы [ 2 ]

1 голос
/ 30 июля 2009

Лучшее, что можно сделать, это установить идентификатор на элементе управления самостоятельно. Если вы этого не сделаете, он будет сгенерирован автоматически при вызове метода EnsureID для элементов управления.
Этот метод вызывается автоматически в разное время, включая, помимо прочего, доступ к геттеру ClientID.
Вы также должны знать, что, если вы динамически манипулируете элементами управления, возможно, что динамически генерируемые идентификаторы могут отличаться в зависимости от порядка добавления элементов управления на страницу.
Кроме того, даже если вы не создаете динамически элементы управления, динамически генерируемый идентификатор может изменяться, если вы принудительно генерируете идентификатор (путем доступа к ClientID) в другом порядке.

1 голос
/ 30 июля 2009

Идентификатор динамически созданных элементов управления равен нулю, если явно не определен до вызова метода RenderControl.

...