Когда самая последняя версия вы можете вызвать Page.ClientScript.RegisterClientScriptBlock?

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
0
3 614
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

OnPreRender

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

Он спросил, как это сделать в WebControl, поэтому вы не можете сделать это во время рендеринга. Если вы переопределяли рендеринг на странице, тогда да, ваше предложение «или» работает.

sliderhouserules 30.12.2008 01:17

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

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

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

sliderhouserules 30.12.2008 01:19

Извините, вы правы - это была большая опечатка. Функция Render каждого элемента управления вызывается ПОСЛЕ основного PreRender, поэтому безопасно вызывать ее во время PreRender. Спасибо за предупреждение!

Maxam 02.01.2009 23:21

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

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

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

Другие вопросы по теме