Зарегистрируйте ClientScriptBlock только один раз в течение нескольких обратных передач
На моих сайтах asp.net я регулярно использую следующие методы перед тем, как фактически добавлять либо нестандартные части скрипта, либо регистрировать файл js:
IsClientScriptBlockRegistered(Type, String)
IsClientScriptIncludeRegistered(Type, String)
Когда для страницы требуется собственный фрагмент скрипта, где-то во время загрузки страницы я вызываю IsClientScriptBlockRegisterd()
с последующим RegisterClientScriptBlock()
,
if (!Page.ClientScript.IsClientScriptBlockRegistered(typeof(Page), "myKey"))
{
// Start creating ScriptBlock //
// .. //
// Actually Register the script //
ToolkitScriptManager.RegisterClientScriptBlock(this, typeof(Page), "myKey",
sbScript.ToString(), false);
}
Приведенный выше код всегда вызывается один раз во время обратной передачи.
Когда пользователь находится на соответствующей странице, оставаясь на этой странице, он может вызвать несколько обратных возвратов (фактические обратные вызовы, а не обратные вызовы). Во время обратной передачи GetRegisteredClientScriptBlocks
Метод всегда возвращает пустую коллекцию. Так IsClientScriptBlockRegistered
всегда возвращает ложь. Поэтому для каждой обратной передачи мне нужно заново создать пользовательский скрипт-блок, перерегистрировать его на странице и повторно отправить клиенту.
Есть ли способ зарегистрировать пользовательский блок сценариев и позволить ему существовать на клиенте до тех пор, пока пользователь остается на соответствующей странице, или до тех пор, пока сеансы пользователей активны?
Заранее спасибо.
1 ответ
Предполагая, что вы используете ASP.Net WebForms, вы можете использовать следующее свойство, чтобы убедиться, что это обратная передача:
Page.IsPostback()
В качестве альтернативы вы можете передать какую-то переменную flag/cookie/hidden, указывающую, что этой конкретной странице не нужно регистрировать клиентские сценарии.