ScriptManager дублирует javascript

У меня есть элемент управления пользователя, который можно использовать, например, в шаблоне элемента gridview, это означает, что элемент управления может быть или не находиться на странице при загрузке страницы. В случае, когда элемент управления находится внутри шаблона элемента, я буду отображать сетку через асинхронные обратные передачи (через панели обновления).

Сам элемент управления блокирует сценарии регистраторов, так как он зависит от сценариев javascript. Сначала я использовал

Page.ClientScript.RegistrerClientScriptBlock

Но это не работает с асинхронными обратными передачами (updatepanels), поэтому я затем попробовал то же самое с помощью ScriptManager, который позволяет мне регистрировать сценарии на странице после асинхронных обратных передач. большой!.

ScriptManager.RegisterClientScriptBlock

Однако ScriptManager (о чем я знаю) не имеет возможности видеть, есть ли уже сценарий на странице, поэтому я буду для каждой обратной передачи генерировать дубликаты блоков сценария, это, конечно, нежелательное поведение.

Я пробежался в Google и обнаружил, что могу вызвать метод Dispose () PageRequestManager, это действительно работает, поскольку он очищает сценарии, а затем добавляет их снова (это также решает мою проблему с удалением неиспользуемых блоков сценариев из удаленных элементы управления).

Sys.WebForms.PageRequestManager.getInstance().Dispose()

Однако, конечно, есть обратная сторона, так как я публикую здесь :). Метод Dispose () также размещает экземпляр на главной странице, что приводит к тому, что выполняющиеся там скрипты перестают работать после асинхронной обратной передачи (например, updateprogress).

Итак, есть ли способ проверить, существует ли уже сценарий на странице с помощью ScriptManager или любых других инструментов, которые не позволят мне вставить повторяющиеся сценарии? Кроме того, есть способ удалить определенные блоки скрипта (например, когда я удаляю элемент в шаблоне элемента).

Заранее большое спасибо.


person Andreas    schedule 28.05.2010    source источник


Ответы (2)


Если вы установите одинаковые атрибуты типа и ключа при регистрации, я думаю, что SM будет включать только один из них.

person Sean Kinsey    schedule 28.05.2010
comment
Хм, похоже, вы правы. Когда я покопался в нем, я действительно понял, что я использовал страницу вместо пользовательского элемента управления для регистрации сценария, что было ошибкой номер один. Ошибка номер два заключается в том, что я включил add_endRequest в свой сценарий, целью которого было обрабатывать асинхронные обратные передачи, но в этом нет необходимости, потому что похоже, что ScripManager делает это за меня, отсюда и повторяющиеся вызовы. Хотя спасибо за ответ :) - person Andreas; 28.05.2010

Попробуйте такую ​​функцию:

Public Sub AddScriptToCompositeScriptSafety(ByRef manager As ScriptManager, ByRef script As ScriptReference)

    For Each item In manager.CompositeScript.Scripts
        If (item.Path = script.Path) Then
            Return
        End If
    Next
    manager.CompositeScript.Scripts.Add(script)

End Sub
person Wolfgang Theophil    schedule 12.07.2012