Как выяснить, какая панель обновления была обновлена на стороне клиента

1

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

Я пробовал следующие вещи:

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

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

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

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

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

  • 0
    Обновлены ли средства, какая панель вызывает обратную передачу?
  • 0
    @TimSchmelter Да. По сути, у меня есть вложенная структура UpdatePanels и некоторых элементов управления Telerik, и мне нужно выяснить, какой из них был обновлен, чтобы ограничить количество вызовов сценариев в зависимости от этой информации.
Теги:
webforms

2 ответа

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 которое можно использовать для получения списка идентификаторов панели, на которые влияет _postBackSettings:

sender._postBackSettings.panelsToUpdate

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

  • 0
    полезно, но не жизнеспособно для моего сценария. Я использовал этот метод раньше в другом сценарии. К сожалению, на этот раз я вынужден заставить его работать в add_init, и нет аналогичного метода для вызова аргументов обработчика.
  • 0
    @ AndreasMüller, может быть, я ошибаюсь, но add_init обработчик add_init только один раз, то есть при первой загрузке страницы, а не после каждой асинхронной обратной передачи?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню