Старый вопрос, но я недавно имел дело с этим, поэтому, чтобы дать ответу Тима немного больше разъяснений и прояснить немного дезинформации:
Если вы используете 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, что происходит после ваши элементы управления должны отображаться, как вы можете видеть в коде выше.