Когда самая последняя версия, которую вы можете вызвать Page.ClientScript.RegisterClientScriptBlock? - PullRequest
4 голосов
/ 31 октября 2008

Мне нужно вывести немного JavaScript в WebControl на основе некоторой обработки и некоторых свойств, которые может установить потребитель, делать это при загрузке страницы будет рано.

Когда последний раз, я могу вызвать RegisterClientScriptBlock и все еще вывести его на страницу?

Ответы [ 4 ]

6 голосов
/ 30 декабря 2008

Старый вопрос, но я недавно имел дело с этим, поэтому, чтобы дать ответу Тима немного больше разъяснений и прояснить немного дезинформации:

Если вы используете RegisterClientScriptBlock, как и просили, ваши сценарии будут выводиться во время ClientScriptManager.RenderClientScriptBlocks, который вызывается во время Page.BeginFormRender, но на самом деле он вызывается формой, а не самой страницей.

Вот последовательность:

  • Page.ProcessRequestMain (когда он достигает секции рендеринга) вызывает
  • (базовый класс страницы) Control.RenderControl, который вызывает
  • Control.RenderChildren, который проходит через все дочерние элементы управления и в конечном итоге вызывает
  • HtmlForm.RenderControl, который вызывает
  • HtmlForm.RenderChildren - это то, что нас волнует

От отражателя:

protected internal override void RenderChildren(HtmlTextWriter writer)
{
    Page page = this.Page;
    if (page != null)
    {
        page.OnFormRender();
        page.BeginFormRender(writer, this.UniqueID);
    }
    base.RenderChildren(writer);
    if (page != null)
    {
        page.EndFormRender(writer, this.UniqueID);
        page.OnFormPostRender();
    }
}

Обратите внимание на вызовы page.BeginFormRender и page.EndFormRender. Между ними форма вызывает ее base.RenderChildren, который в конечном итоге вызовет метод Render в вашем пользовательском элементе управления. Таким образом, чтобы быть верным исходному вопросу, вы не можете взаимодействовать с частью сценариев ClientScriptBlocks в любое время во время последовательности Render любого дочернего элемента управления, поскольку они уже были выведены в поток ответа. Вы можете добавить сценарии в этот блок во время последовательности Render, если вы используете метод Render страницы, прежде чем вызывать base.Render, как упоминает Тим, но это не работает в дочерних элементах управления любого рода.

Если последовательность Render - это все, с чем вам нужно работать (это ситуация, в которой я нахожусь), тогда вы можете использовать ClientScript.RegisterStartupScript во время Render вашего элемента управления, так как RenderClientStartupScripts вызывается во время page.EndFormRender, что происходит после ваши элементы управления должны отображаться, как вы можете видеть в коде выше.

3 голосов
/ 31 октября 2008

OnPreRender

или, если вы переопределяете Render .... перед вызовом base.Render

1 голос
/ 31 октября 2008

Даже на главной странице вы можете позвонить во время PreRender. Функция Render каждого элемента управления вызывается после PreRender главной страницы, поэтому функция Render будет безопасным местом.

1 голос
/ 31 октября 2008

Логически, ваш скрипт запуска должен быть отрисован так же, как и зарегистрирован на странице, так что событие Page_PreRender может показаться хорошим выбором. После этого HTML и скрипт для страницы «заблокированы».

...