2014-07-25 1 views
1

Для моей конкретной проблемы мне нужно найти способ на стороне клиента, который был обновлен UpdatePanel. Чтобы понять, что на сервере ServerSide не очень сложно (есть множество SO-вопросов об этом), но я бы предпочел более общее решение для клиентской стороны.Как определить, какая обновленная панель обновилась на clientide

Я попытался следующие вещи:

  • Я осмотрел объект PageRequestManager клиента без успеха
  • Я проверил значение $("#__EVENTTARGET").val() в надежде на какой-либо ID работать (всегда пустой)

Мой сценарий заключается в том, что я написал скрипт для элемента управления, который выполняется через Sys.Application.add_init, поэтому скрытое поле EVENTTARGET еще не заполнено.

Моя идея - это методы смешивания ASP.MVC (IHttpModule) и Webforms (например, here), чтобы получить чистое и общее решение.

Таким образом, мой план - получить доступ к параметрам запроса и ввести JS в ответ, который объявляет eventtarget для меня.

Что мне сейчас интересно: Является ли это хорошим решением или я не знаю какой-либо существующей функции, чтобы выяснить, какая обновленная панель была обновлена? (Или это уродливое решение, и вы знаете, что это лучший способ сделать это)

+0

Обновлено означает, что панель вызывает обратную передачу? –

+0

@TimSchmelter Да. В основном у меня есть вложенная структура UpdatePanels и некоторых элементов управления Telerik, и вам нужно выяснить, какой из них был обновлен, чтобы ограничить мои вызовы скриптов в зависимости от этой информации. – Dbl

ответ

0

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

1

Один из способов узнать имена панелей обновлений, которые будут обновляться после обратной передачи, заключается в использовании Sys.WebForms.PageRequestManager pageLoading Event.

Из MSDN:

Воспитанного после ответа от сервера к асинхронному постбэк принимаются, но до любого содержания на странице обновляется.

Чтобы получить список обновлений панелей необходимо вызвать get_panelsUpdating функции:

<script> 
    Sys.WebForms.PageRequestManager.getInstance().add_pageLoading(pageLoadingHandler); 

    function pageLoadingHandler(sender, args) { 

     console.log("Following panels are going to be updated:"); 
     var panelsToBeUpdated = args.get_panelsUpdating(); 
     for (var index in panelsToBeUpdated) { 
      console.log(panelsToBeUpdated[index].id); 
     } 
    } 
</script> 

В качестве альтернативы вы можете перехватить асинхронный постбэк, прежде чем что-либо будет отправлен на сервер с помощью Sys.WebForms.PageRequestManager initializeRequest Event. Я думаю, что можно было бы сохранить список панелей обновлений в какой-либо переменной/поле/независимо от того, что доступно для вашего скрипта.

<script> 
    Sys.WebForms.PageRequestManager.getInstance().add_initializeRequest(initializeRequestHandler); 

    function initializeRequestHandler(sender, args) { 

     var panelsToBeUpdated = args.get_updatePanelsToUpdate(); // This function returns client ids of update panels 
     for (var index in panelsToBeUpdated) { 
      console.log(panelsToBeUpdated); 
     } 
    } 
</script> 

В любом случае, почти все страницы обработчиков событий sender параметров, имеющие _postBackSettings поля, которое может быть использовано для получения списка панелей идентификаторов, пострадавшие от постбэк:

sender._postBackSettings.panelsToUpdate 

Единственного недостатком этого поля является _ в его имени, что означает, что оно является «частным», и его следует избегать для непосредственного доступа.

+0

полезен, но не подходит для моего сценария. Я использовал этот метод раньше в другом сценарии. к сожалению, на этот раз я обязан заставить его работать в add_init, и нет подобного метода для вызова args обработчика. – Dbl

+0

@ AndreasMüller, может быть, я ошибаюсь, но не обработчик 'add_init', вызываемый только один раз, то есть первая загруженная страница, а не после каждой обратной пересылки async? –

+0

Вы правы в этом. Однако в моем сценарии я связываю его с init, а также запускаю его во время рендеринга, заставляя мой сценарий работать в оба раза. К сожалению, это часть причины, по которой мне нужно найти способ выяснить интересующую панель. (Также я не могу использовать add_load, потому что некоторые элементы управления внутри моего элемента управления используют это событие, и мне нужно, чтобы мой скрипт был выполнен до этого) – Dbl

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