2009-07-04 2 views
2

У меня есть веб-приложение, которое отлично работает в нашей среде сцены/тестирования, но как только мы переместили его в нашу производственную среду, произойдет что-то странное. Все контрольные идентификаторы меняются. Например, ярлык перешел от ctl00_cphMainContent_lblPetName к _ctl0_cphMainContent_lblPetName. Почему это произойдет? Что может привести к чему-то подобному. Единственные два отличия, о которых я знаю, - это производственная среда с HTTPS, и я отключил отладку.Идентификация идентификатора элемента управления между средами

+0

Его не связано с vb.net или javascript, пожалуйста, удалите эти теги. –

ответ

1

Ваш web.configs отличается. Поведение генерации идентификатора клиента зависит от EnableLegacyRendering. Пожалуйста, просмотрите файл xhtmlConformance вашего web.config. Если это Legacy, вы получите «_ctl», если нет - «ctl».

+0

Спасибо, что это была именно эта проблема. У корневого web.config этот набор был устаревшим, и это было унаследовано нашим приложением, которое находилось в подпапке. – 2009-07-06 14:03:50

4

Как способ генерации идентификатора клиента может изменяться между различными версиями фреймворка, вы не должны полагаться на определенный шаблон.

Свойства, относящиеся к ClientID и UniqueID, должны использоваться с целью определения имени и имени, которые генерируются для кода html.

Свойство ClientID содержит сгенерированный идентификатор, который вы, например, можете использовать с методом document.getElementById в Javascript.

Свойство UniqueID содержит сгенерированное имя, которое вы, например, можете использовать, если вы прочитали стоимость, отправленную с помощью формы из коллекции Request.Form.

+0

Это изменение было между 1.1 и 2.0 и, вероятно, будет в 4.0. Я не думаю, что среда настолько сильно отличается ... –

+0

Я не думаю, что это конкретное поведение изменится в 4.0, так как все версии фреймворка с 2.0 являются инкрементальными. –

0

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

Обычный способ сделать это что-то вроде этого:

var btn1 = document.getElementById(" <%= button1.ClientID %>"); 

Я всегда ненавидел это, так как, по сути, вы пишете все ваши JavaScript во время выполнения. Вместо этого мне нравится, чтобы страница (или элемент управления) излучала класс, содержащий все идентификаторы элементов управления (или другие значения на стороне сервера), которые ему нужны.

Я бы опубликовал пример, но я не сделал этого какое-то время, и у меня его нет. В принципе, создайте класс JavaScript с членами для каждого идентификатора элемента управления, который вам нужен, и зарегистрируйте его со страницей. Затем зарегистрировать сценарий запуска, который делает что-то вроде этого:

myPage_Instance.btn1 = <%= button1.ClientID %>; // Better - do it in the codebehind 
// more of the same 

Ваш код теперь может быть:

вар btn1 = document.getElementById (myPage_Instance.btn1);

Смежные вопросы