2010-04-15 11 views
2

Я унаследовал проект с некоторым неприятным JavaScript, который зависит от жестко закодированных идентификаторов объектов.
т.е. Есть много мест, где он делает вещи, как этотГде ASP.Net получает свои визуализированные идентификаторы?

var magazine = document.getElementById('repModuleDisplay__ctl3_chkCats_0'); 

Когда страница отображается в моей UAT среды, HTML выглядит следующим образом, и все работает нормально.

<input id="repModuleDisplay__ctl3_chkCats_0" 
    type="checkbox" name="repModuleDisplay:_ctl3:chkCats:0" 
    ... etc 

Однако, когда я положил его на мою среде производства, HTML внезапно разрывая так:

<input id="repModuleDisplay_ctl03_chkCats_0" 
    type="checkbox" name="repModuleDisplay$ctl03$chkCats$0" 
    ... etc 

Разница в идентификаторах означает, что JavaScript не может найти элемент, и не ,

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

У кого-нибудь есть идеи?

Спасибо, Нил

ответ

7

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

// i've assumed that the control is named chkCats 
var magazine = document.getElementById('<%= chkCats.ClientID %>'); 
+0

Спасибо Luke ... Единственный потенциальный икота - это то, что есть флажки с чекбоксами chkCat, и JavaScript должен срабатывать только при нажатии на один конкретный (я знаю ... я знаю ...). Я отдам его и посмотрю, смогу ли я заставить его работать. – NeilD

+1

@NeilD: Другая возможность (особенно если флажки содержатся в каком-то контейнере, таком как ретранслятор), может заключаться в том, чтобы использовать JavaScript - или, может быть, что-то вроде jQuery - найти соответствующий флажок на стороне клиента во время выполнения. – LukeH

2

Использование .NET4 и установите свойство ClientIDMode на ваши элементы управления, которые вы хотите использовать с JS.

EG;

<asp:TextBox ID="txtComment" runat="server" CssClass="myClass" 
    ClientIDMode="Static" MaxLength="1024"></asp:TextBox> 
+0

К сожалению, не вариант ... Это неприятный проект с некоторыми страницами в .Net 3.5, некоторые из .Net 2 и некоторые из .Net 1.1 ... Угадайте, какая версия вызывает проблему ?? .Net 1.1 – NeilD

+0

Я не уверен, что обновление всей среды разработки, тестирования и производства для использования .NET4 будет квалифицироваться как «быстрое исправление»! – LukeH

+0

Вы меня там ... но что-то помнить :) – GordonB

4

Вы должны использовать clientID для управления asp.net.

'<%=mycontrol.ClientID %>' 
1

This link дает краткое описание того, как ASP.NET создает идентификаторы, и все другие плакаты рекомендуется правильное решение с использованием ClientID элемента управления.

Если вы хотите, чтобы держаться подальше от тегов в стиле ASP, то другой вариант испускать некоторые JS на страницу во время PreRender:

StringBuilder sb = new StringBuilder(); 
sb.AppendLine(string.Format("var myTextBox = document.getElementById('{0}');", MyTextBox.ClientID)); 
if (!Page.ClientScript.IsClientScriptBlockRegistered(this.GetType(), "myElementDefinitions")) 
    Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "myElementDefinitions", sb.ToString()); 

, а затем в вашем яваскрипте кода, который вы просто сослаться на него с имя myTextBox. Этот вариант может вас не устраивать, зависит от вашего кода и того, как часто вы используете теги ASP для ссылки на один и тот же идентификатор элемента управления.

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