ScriptManager дублирует JavaScript - PullRequest
0 голосов
/ 28 мая 2010

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

Элемент управления сам по себе блокирует скрипты регистраторов, поскольку он зависит от JavaScript. Сначала я использовал

Page.ClientScript.RegistrerClientScriptBlock

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

ScriptManager.RegisterClientScriptBlock

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

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 12 июля 2012

Попробуйте функцию, подобную этой:

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
0 голосов
/ 28 мая 2010

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

...