Sys.Application.add_init не вызывается при обновлении UpdatePanel - PullRequest
2 голосов
/ 04 сентября 2010

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

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 потребляющей страницей / элементом управления. Когда другой элемент управления инициирует обновление, все пользовательские интерфейсы элемента управления перерисовываются, НО событие init НИКОГДА НЕ ЗАПУСКАЕТСЯ.

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

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

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

РЕДАКТИРОВАТЬ: подумал, что я бы включить метод Render, который я делаю в части 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");
    }

1 Ответ

0 голосов
/ 02 ноября 2010

Вам не нужно писать все эти вещи Sys.Application.add_init самостоятельно;реализовать IScriptControl согласно этой статье MSDN .

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

В качестве сноски, здесь есть отдельная, но похожая статья , если вместо этого вы используете Sys.UI.Behavior.

...