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

StackOverflow https://stackoverflow.com/questions/253267

Вопрос

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

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

Это было полезно?

Решение

OnPreRender ( Первичный поставщик )

или, если вы переопределите Рендеринг....перед вызовом "база.Визуализация"

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

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

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

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

  • Страница.ProcessRequestMain (когда он достигает раздела рендеринга) вызывает
  • Элемент управления (базовый класс страницы).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, который в конечном итоге вызовет метод рендеринга в вашем пользовательском элементе управления.Таким образом, чтобы быть верным вашему первоначальному вопросу, вы не можете взаимодействовать с частью скриптов ClientScriptBlocks в любое время во время последовательности рендеринга любого дочернего элемента управления, поскольку они уже были выведены в поток ответов.Ты может добавьте скрипты в этот блок во время последовательности рендеринга, если вы используете метод рендеринга Страницы перед вызовом base .Рендеринг, как упоминает Тим, но это не работает в дочернем элементе управления любого типа.

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top