__dopostback работает не так, как ожидалось

#jquery #asp.net #visual-studio #updatepanel

#jquery #asp.net #visual-studio #панель обновления

Вопрос:

Сценарий 1 (который работает)Это POC, который я создал. У меня есть менеджер сценариев, текстовое поле html, ASP.NET кнопка, панель обновления с установленным асинхронным триггером для события нажатия вышеупомянутой кнопки. Для текстового поля html у меня есть, onkeyup='__doPostBack('<%=ASPBUTTON.ClientID%>','') . И ЭТО РАБОТАЕТ, событие нажатия кнопки нажато, и updatepanel обновляется асинхронно.

Сценарий 2 (он не работает)Единственное отличие от моей реальной кодовой базы заключается в том, что у меня есть JQUERY FILAMENTGROUP datetimepicker, событие onchange которого используется вместо onchange текстового поля html. Кроме того, здесь моя страница использует главную страницу. Теперь моя проблема в том, что при срабатывании события onchange для datetimepicker запрос отправляется на сторону сервера, но событие нажатия кнопки не запускается.

Еще несколько деталей, я хочу автоматически обновлять панель обновлений при выборе datetimepicker. Таким образом, кнопка была бы фактически скрыта с помощью css (отображение:отсутствует).

Идентификатор кнопки — btnDateRangeCallback

Текстовое поле Datetimepicker (не ASP-элемент управления) — DateRange

         onChange: function() {__doPostBack('<%=btnDateRangeCallback.ClientID%>',   $('#dateRange').val());}
  

[Пожалуйста, помните, я сказал, что это работает в случае моего упрощенного POC, в то время как в моей реальной кодовой базе я использую masterpage для наследования, и поэтому все эти элементы управления помещаются в contentplaceholder. Кроме того, происходит обратная отправка, и я вижу, что _EVENTTARGET и _EVENTARGUMENT отправляются правильно, если я прерываю работу при загрузке страницы]

Пожалуйста, помогите.

Проще говоря, после обратной отправки, когда я прерываюсь на Page_Load, я вижу запрос.Содержимое формы как, ctl00$ContentPlaceHolder1$SMgr1=ctl00$ContentPlaceHolder1$SMgr1|ctl00_ContentPlaceHolder1_btnDateRangeCallback amp;__EVENTTARGET=ctl00_ContentPlaceHolder1_btnDateRangeCallback amp;_EVENTARGUMENT=5/3/2011 — 6% 2f2/2011 amp;_VIEWSTATE=/wEPDwULLTE3NDY5NDIwMDRkZIuTqMNNsFHlRYhjpKaUCaCXj42h amp;_EVENTVALIDATION=/wEWAgLBx52kBALP6Ln6DdkkwE/rVIKQzKE1L0k4QhIc768w amp;_ASYNCPOST=trueamp;

Почему не происходит событие Click для обратного вызова btnDateRangeCallback???

Ответ №1:

Вместо этого используйте UniqueID: __doPostBack('<%=btnDateRangeCallback.UniqueID %>', ...

Ответ №2:

Измените свой код на этот:

 setTimeout(function () { __doPostBack('btnSave', '') }, 500);
  

Используйте «btnSave Id». Это будет работать во всех браузерах.

Ответ №3:

Почему бы просто не нажать кнопку?

 onchange="$('#<%= ASPBUTTON.ClientID %>').click()"
  

(В идеале, также не используйте встроенные обработчики событий …)

Если это вас не устраивает, вы можете обойти это с помощью __EVENTTARGET и __EVENTARGUMENT (руководство см. в этой статье).

Ответ №4:

Причина, по которой он не работает, заключается в том, что он находится в хранилище содержимого.

Первый параметр __doPostBack используется на стороне сервера, на стороне клиента это может быть что угодно. Вызывается So __doPostBack и отправляется по желанию, но на сервере значение первого параметра используется для поиска элемента управления, который будет обрабатывать события. Он используется для поиска элемента управления с соответствующим UniqueID.

Когда не в NamingContainer, UniqueID и ClientID совпадают, внутри NamingContainer идентификатор клиента создается с использованием символов подчеркивания (_), а UniqueID создается с использованием знаков доллара ($).

Поскольку значение, которое сервер получает в этом случае, не позволяет ему найти элемент управления, он не знает, какое событие запускать, и поэтому не запускает ни одного, несмотря на регистрацию как post back и появление «__EVENTTARGET», которое позволило бы ему найти элемент управления.

ClientID ИНОГДА будет работать, когда ЕГО НЕТ на главной странице, в частности, он будет работать до тех пор, пока элемент управления не находится внутри NamingContainer . Причина, по которой это никогда не будет работать внутри главной страницы, заключается в том, что на главной странице всегда есть контейнер именования.