ASP.NET AJAX и UserControls: обработка сценариев на стороне клиента - PullRequest
1 голос
/ 16 июня 2009

У меня есть UserControl, который я хочу включить в страницу несколько раз программно на основе некоторых бизнес-правил. В настоящее время элемент управления имеет функцию JavaScript, которая должна вызываться в событии ASP.NET AJAX pageLoad.

Я использую шаблон, где на главной странице есть функция pageLoad, которая вызывает функцию contentPageLoad на любом шаблоне ContentTemplate, если функция существует. ContentTemplate, который содержит соответствующий UserControl, будет отвечать за вызов соответствующей функции в UserControl во время этого события.

Прямо сейчас, JavaScript является встроенным в .ascx для UserControl, но у меня есть ощущение, что мне нужно использовать свойство Page.ClientScript, чтобы внедрить его через код позади. У меня вопрос: как мне убедиться, что имена моих функций не перекрываются, и убедиться, что соответствующий метод вызывается для каждый UserControl?

К вашему сведению: код, который необходимо выполнить для каждого элемента UserControl, представляет собой блок jQuery, который создает элемент управления Multi-Select из стандартного HTML <select>.

РЕДАКТИРОВАТЬ: RegisterStartupScript было предложено, но это выполняется до завершения загрузки DOM. Оборачивание функции в jQuery Document.ready (), похоже, не помогает. Пользовательский элемент управления работает внутри UpdatePanel, поэтому у меня нет выбора, как вызывать этот сценарий.

Ответы [ 2 ]

2 голосов
/ 17 июня 2009

Так что я решил использовать гибридный подход к тому, что предложил @DDaviesBrackett. Я регистрирую функцию с Page.ClientScript, не как сценарий запуска, а как ClientScriptBlock. Функция использует классы вместо идентификаторов (и, следовательно, ClientID s) для присоединения к каждому элементу управления. Базовая структура:

if(!Page.ClientScript.IsClientScriptBlockRegistered(Page.GetType(),"scriptkey"))
{
    Page.ClientScript.RegisterClientScriptBlock(
        Page.GetType(),"scriptkey",script,true);
}

со следующим скриптом:

function bindMultiSelects() {
    $('.multiselectclass').multiSelect({
        oneOrMoreSelected: '*', 
        noneSelected: 'Select Item(s)'
    });
}

(с использованием потрясающего плагина jQuery MultiSelect )

Опять же, это работает, потому что моя главная страница создает метод page_load, который затем вызывает метод для содержимого, который затем вызывает bindMultiSelects. Просто для справки, функции page_load и contentPageLoad следуют этой схеме "плагина", которую я нашел здесь :

if(typeof functionname=='function') {
    functionname()
}
2 голосов
/ 16 июня 2009

Одним из решений является использование ClientID пользовательского элемента управления в определении функции JS:

function onLoadInitialize_<%=ClientID%>(){/*do things*/}

, а затем используйте Page.ClientScript.RegisterStartupScript, чтобы это произошло во время client-onLoad. Имейте в виду, что page_load происходит при каждой асинхронной обратной передаче ; если вы хотите, чтобы все происходило только один раз за фактическую загрузку страницы (исключая асинхронные обратные передачи), используйте вместо этого событие init.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...