2009-09-10 3 views
1

Иногда я отчаиваюсь при работе с ASP.Net - еще одна проблема, которой не должно быть!Доступ к ClientID прерывает обратную передачу

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

В коде позади, как часть Page_Load, мне нужно получить доступ к идентификатору ClientID текстового поля, чтобы зарегистрировать некоторый javascript ... так что я делаю, и javascript, кажется, делает все, что ему нужно. Все счастливы.

Нет, нет, очевидно, все недовольны, ASP.Net сама очень несчастна!

На доступ к ClientID, то идентификатор, который появляется в источнике:

myControl_myTextBox 

закомментировать строку, которая обращается к ClientID означает идентификатор отображается как:

ctl00_BodyPlaceHolder_myControl_myTextBox 

линии, которая доступ к идентификатору ClientID выглядит так:

jsBuilder.AppendFormat(@"var filter = new TBFilter($(""#{0}"")[0]);", myTextBox.ClientID); 

Это само по себе не является э-э-э-э, но тот факт, что он нарушает обратную передачу, делает! Если вы введете что-то в это текстовое поле и нажмите кнопку отправки (есть кнопка отправки на странице!), Она перезагружает страницу, но возвращает значение по умолчанию в текстовое поле и полностью игнорирует то, что вы изначально имели. Безумие - я не делал ничего особенно странного и необычного, так почему же он сломал обратную передачу?

+0

Если я правильно понимаю, свойство ClientID для текстового поля первоначально является ctl00_BodyPlaceHolder_myControl_myTextBox, но после обратной передачи ClientID теперь является myControl_myTextBox для текстового поля? –

+0

Не жалко, если я получаю доступ к свойству ClientID, идентификатор выходит из myControl_myTextBox, но если я прокомментирую эту строку, id выйдет ctl00_BodyPlaceHolder_myControl_myTextBox - я отредактирую вопрос, чтобы отразить это значение – Paul

+0

jsBuilder.AppendFormat (@ "var filter = new TBFilter ($ ("" # {0} "") [0]); ", myTextBox.ClientID); – Paul

ответ

3

javascript, который вы регистрируете в загрузке страницы, делает что-то, что не должно произойти в обратной передаче? Если это так, вы должны проверить на Page.IsPostback, чтобы контролировать, когда его использовать.

Вы также должны знать, что в жизненном цикле страницы Page_Load возникает перед любыми событиями обратной передачи управления (например, Click событие на кнопке). Поэтому, если код javascript, который вы регистрируете, зависит от результата события Click, вы должны либо зарегистрировать его внутри события Click (если это произойдет только при нажатии на эту кнопку), либо в событии Page_PreRender (если это всегда должно произойти).

EDIT:
Это также может быть, что некоторые изменения сделаны после того, как Page_Load клиента идентификаторы создаются. Лучше всего это сделать в событии Page_PreRender, чтобы убедиться, что все закончилось загрузкой.

+0

Я переместил его в Page_PreRender, и это, похоже, решает проблему. Все еще не думайте, что это должно было быть проблемой в первую очередь! – Paul

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