Для моей конкретной проблемы мне нужно найти способ на стороне клиента, обновленный UpdatePanel
. Чтобы понять, что на сервере ServerSide не совсем сложно (есть множество SO-вопросов об этом), но я бы предпочел более общее решение для клиентской стороны.
Я пробовал следующие вещи:
PageRequestManager
клиента PageRequestManager
$("#__EVENTTARGET").val()
в надежде, что любой ID будет работать с (всегда пустым) Мой сценарий заключается в том, что я написал скрипт для Sys.Application.add_init
управления, который выполняется через Sys.Application.add_init
, поэтому скрытое поле EVENTTARGET еще не заполнено.
Моей идеей были бы методы смешивания ASP.MVC(IHttpModule) и Webforms (например, здесь), чтобы получить чистое и общее решение.
Таким образом, мой план - получить доступ к параметрам запроса и ввести JS в ответ, который объявляет eventtarget для меня.
Теперь мне интересно, является ли это хорошим решением или я не знаю какой-либо существующей функции, чтобы выяснить, какая обновленная панель была обновлена? (Или это уродливое решение, и вы знаете лучший способ сделать это)
Тем временем я модифицировал свое производственное решение, но для этой конкретной проблемы вы действительно можете реализовать IHttpModule и ввести код для обновления информации в javascript, если кто-то наткнется на аналогичный сценарий.
Один из способов узнать имена панелей обновлений, которые будут обновляться после обратной передачи, - это использовать 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
Единственным недостатком этого поля является _
в его имени, что означает, что он "частный" и его следует избегать для непосредственного доступа.
add_init
обработчик add_init
только один раз, то есть при первой загрузке страницы, а не после каждой асинхронной обратной передачи?