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





OnPreRender
или, если вы переопределите Render .... перед вызовом base.Render
По логике, ваш сценарий запуска должен быть визуализирован, а также зарегистрирован на странице, поэтому событие Page_PreRender может показаться хорошей ставкой. После этого HTML и скрипт страницы блокируются.
Даже на главной странице вы можете вызвать его во время PreRender. Функция Render каждого элемента управления вызывается после PreRender главной страницы, поэтому функция Render будет безопасным местом.
«Функция Render каждого элемента управления вызывается перед PreRender главной страницы» - пожалуйста, скажите мне, что это опечатка, потому что это совсем не правильно.
Извините, вы правы - это была большая опечатка. Функция Render каждого элемента управления вызывается ПОСЛЕ основного PreRender, поэтому безопасно вызывать ее во время PreRender. Спасибо за предупреждение!
Старый вопрос, но я недавно занимался этим, поэтому, чтобы дать ответ Тима немного больше прояснения и прояснить немного дезинформации:
Если вы используете RegisterClientScriptBlock, как вы просите, то ваши сценарии будут выводиться во время ClientScriptManager.RenderClientScriptBlocks, который вызывается во время Page.BeginFormRender, но на самом деле он вызывается формой, а не самой страницей.
Вот такая последовательность:
От отражателя:
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 в любое время во время последовательности рендеринга любого дочернего элемента управления, поскольку они уже были выведены в поток ответа. Вы может добавляете скрипты в этот блок во время последовательности рендеринга, если вы находитесь в методе рендеринга страницы перед вызовом base.Render, как упоминает Тим, но это не работает ни в каком дочернем элементе управления.
Если последовательность рендеринга - это все, с чем вам нужно работать (это ситуация, в которой я нахожусь), вы можете использовать ClientScript.RegisterStartupScript во время рендеринга вашего элемента управления, поскольку RenderClientStartupScripts вызывается во время page.EndFormRender, что происходит после вашим элементам управления сообщается render, как вы можете видеть в приведенном выше коде.
Он спросил, как это сделать в WebControl, поэтому вы не можете сделать это во время рендеринга. Если вы переопределяли рендеринг на странице, тогда да, ваше предложение «или» работает.