Зарегистрируйте OnClientItemSelected для динамического автозаполнения Extender

Я создал UserControl, который содержит AutoCompleteExtender AjaxControlToolkit. Это хорошо работает, когда у меня есть один или несколько статически разработанных экземпляров на одной странице. Однако, если один из этих элементов управления добавляется динамически (скажем, в UpdatePanel), <script> блок (который я в настоящее время встроил в представление Source) для этого одного элемента управления, кажется, недоступен (JavaScript жалуется, что не может найти функцию, которую я подключаю к OnClientItemSelected).

Я подозреваю, что мне нужно зарегистрировать сценарии для UserControl в событии PreRender, чтобы они были доступны даже при динамическом добавлении на страницу. Я использую ToolkitScriptManager, и представьте, что мне нужно вызвать ScriptManager.RegisterScriptControl(this); от моего контроля, а затем реализовать интерфейс IScriptControl.

Это правильный подход? Если это так, чтобы правильно реализовать IScriptControl, мне нужно переместить блок скрипта из представления исходного кода в его собственный файл.js? Это заставило бы меня перепроектировать мою функцию JS, потому что она вызывает встроенный код для получения ClientID для субконтроля в этом конкретном экземпляре:

var hiddenField = $get('<%=this.hfItemID.ClientID%>');

Управление сценариями и JS - не моя специальность, поэтому я хочу быть уверенным, что это верное направление, прежде чем усложнять UserControl, который работал отлично, пока я не начал добавлять их программно.

Обновить

Я переместил JavaScript в код позади и регистрирую его как ClientScript, в надежде, что он немного приблизит меня к тому месту, где я должен быть:

string searchScript = "function " + this.aceItemSearch.ClientID + "_getByID(sender, e) { var hfield = $get('" + this.hfItemID.ClientID + "'); if (typeof hfield === 'undefined') return; var item = eval('(' + e._value + ')'); hfield.value = item.ID; if (typeof document != 'undefined') { var control = $get('" + this.btnSearch.ClientID + "'); } control.click(); }";    
Page.ClientScript.RegisterStartupScript(this.GetType(), aceItemSearch.ClientID + "_getByID", searchScript, true);

Это работает для статически размещенного элемента управления, но, как и прежде, не для динамически добавляемого. Скрипт просто не попадает в представление исходного кода.

1 ответ

Решение

Перемещение сценария к коду позади работает, когда вызывается статическая версия RegisterStartupScript с 5 аргументами. Укажите сам UserControl в качестве первого параметра:

string searchScript = "function " + this.aceItemSearch.ClientID + "_getByID(sender, e) { var hfield = $get('" + this.hfItemID.ClientID + "'); if (typeof hfield === 'undefined') return; var item = eval('(' + e._value + ')'); hfield.value = item.ID; if (typeof document != 'undefined') { var control = $get('" + this.btnSearch.ClientID + "'); } control.click(); }";    
ScriptManager.RegisterStartupScript(this, this.GetType(), aceItemSearch.ClientID + "_getItemByID", searchScript, true);
Другие вопросы по тегам