2010-09-03 2 views
2

У меня есть пользовательский элемент управления пользовательского интерфейса, который имеет класс JavaScript, написанный вокруг рамки AJAX.NET. Он наследуется от Sys.UI.Control. Сам элемент управления - UserControl. В методе рендеринга я обертываю элемент управления в промежутке и выдаю идентификатор span идентификатора ClientID пользовательского элемента управления. Таким образом, я могу это сделать позже:Sys.Application.add_init Не вызывается при обновлении UpdatePanel

var control = $find('<%= ServerControlID.ClientID %>'); 

Это позволяет мне получить объект-клиент, представляющий элемент управления пользовательского интерфейса.

создать элемент управления в JavaScript, делая это (также в методе визуализации)

writer.Write(@"<script type='text/javascript'> 
Sys.Application.add_init(function() { 
debugger; 
    $create(General.Filters.AccountGroupFilter, 
     " + GetProperties() + @", 
     null, 
     null, 
     $get('" + this.ClientID + @"')); 
}); 
</script>"); 

Это создает объект. Это делается внутри события init жизненного цикла.

Проблема заключается в том, что этот элемент управления обернут внутри UpdatePanel потребляющей страницей/элементом управления. Когда другое управление инициирует обновление, все пользовательские интерфейсы элементов управления перерисовываются, НО событие инициализации NEVER FIRES снова.

Что происходит тогда, когда я делаю это:

var control = $find('<%= ServerControlID.ClientID %>'); 
if(control != null) 
    control.doSomething(); 

Ничего не происходит, потому что $ находка не находит контроля после вызова AJAX. Я знаю, что НЕ делаю это правильно. Где я иду не так. Статья MSDN для этого материала указывает мне круги!

EDIT: Понял я включать метод, который я делаю в части UserControl.cs Рендер

protected override void Render(HtmlTextWriter writer) 
    { 
     writer.Write("<span id=\"" + this.ClientID + "\" >"); 
     writer.Write(@"<script type='text/javascript'> 
     Sys.Application.add_init(function() { 

     $create(TradePMR.OMS.Resources.UserControls.General.Filters.AccountGroupFilter, 
     " + GetProperties() + @", 
     null, 
     null, 
     $get('" + this.ClientID + @"')); 
     }); 
     </script>"); 

     base.Render(writer); 
     writer.WriteEndTag("span"); 
    } 

ответ

0

Вам не нужно писать все, что Sys.Application.add_init материал самостоятельно; осуществить IScriptControl согласно this MSDN article.

Ключом является часть о RegisterScriptControl и RegisterScriptDescriptors, которая регистрирует ваш контроль с помощью ScriptManager, так что асинхронный обратный вызов воссоздает ваш клиентский контроль по мере необходимости.

В качестве примечания есть seperate but similar article here, если вы используете вместо этого Sys.UI.Behavior.

Смежные вопросы