2008-10-31 4 views
4

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

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

ответ

3

OnPreRender

или, если переопределить Рендер .... перед вызовом «base.Render»

+0

Он спросил об этом в WebControl, поэтому вы не можете сделать это во время Render.Если вы переопределили Render на странице, тогда да, ваше предложение «или» должно быть выполнено – sliderhouserules 2008-12-29 22:17:19

1

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

1

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

+0

«Функция Render каждого элемента вызывается перед PreRender главной страницы» - пожалуйста, скажите мне, что это опечатка, потому что это неверно. – sliderhouserules 2008-12-29 22:19:37

+0

Извините, вы правы - это была большая опечатка. Функция Render каждого элемента управления называется ПОСЛЕ ПРЕДВАРИТЕЛЬНОГО ПРЕДВАРИТЕЛЬНОГО ПРЕДУПРЕЖДЕНИЯ, поэтому ее можно вызвать во время PreRender. Спасибо за хедз-ап! – Maxam 2009-01-02 20:21:15

6

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

Если вы используете 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. Между ними форма называется базой. RenderChildren, которая в конечном итоге вызовет метод Render в пользовательском элементе управления пользователя. Поэтому, чтобы быть верным исходному вопросу, вы не можете взаимодействовать с частью скриптов ClientScriptBlocks в любое время во время последовательности Render любого дочернего элемента управления, поскольку они уже были переданы в поток Response. Вы можете указать : добавьте скрипты в этот блок во время последовательности Render, если вы находитесь в методе рендеринга страницы, прежде чем вызвать base.Render, как упоминает Тим, но это не работает в дочернем элементе управления любого типа.

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

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