Page.ClientScript.RegisterClientScriptBlock을 호출할 수 있는 가장 늦은 시간은 언제입니까?
-
05-07-2019 - |
문제
일부 처리 및 소비자가 설정할 수 있는 일부 속성을 기반으로 WebControl에서 일부 JavaScript를 출력해야 하는데, 페이지 로드 시 이를 수행하는 작업은 초기 작업이 될 것입니다.
RegisterClientScriptBlock을 호출하고 페이지에 계속 출력할 수 있는 마지막 날짜는 언제입니까?
해결책
onprerender
또는 렌더를 재정의하는 경우 .... "base.render"를 호출하기 전에
다른 팁
오래된 질문이지만 최근에 이 문제를 다루었으므로 Tim의 답변에 좀 더 명확한 설명을 제공하고 약간의 잘못된 정보를 정리했습니다.
요청한 대로 RegisterClientScriptBlock을 사용하면 Page.BeginFormRender 중에 호출되는 ClientScriptManager.RenderClientScriptBlocks 중에 스크립트가 출력되지만 실제로는 페이지 자체가 아닌 양식에 의해 호출됩니다.
순서는 다음과 같습니다.
- 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에 대한 호출을 확인하세요.그 사이에서 양식은 사용자 정의 사용자 정의 컨트롤에서 Render 메서드를 호출하는 base.RenderChildren을 호출합니다.따라서 원래 질문에 충실하려면 하위 컨트롤의 렌더 시퀀스가 이미 응답 스트림으로 출력되었으므로 스크립트의 ClientScriptBlocks 부분과 상호 작용할 수 없습니다.너 ~할 수 있다 Tim이 언급한 것처럼 base.Render를 호출하기 전에 페이지의 Render 메서드에 있는 경우 Render 시퀀스 중에 이 블록에 스크립트를 추가하세요. 하지만 이는 어떤 종류의 하위 컨트롤에서도 작동하지 않습니다.
렌더링 시퀀스만 작업해야 하는 경우(제가 처한 상황), 컨트롤의 렌더링 중에 ClientScript.RegisterStartupScript를 사용할 수 있습니다. 이는 RenderClientStartupScripts가 page.EndFormRender 중에 호출되기 때문입니다. ~ 후에 위 코드에서 볼 수 있듯이 컨트롤은 렌더링하라는 메시지를 받습니다.
논리적으로 시작 스크립트를 페이지에 등록하고 등록해야하므로 Page_Prerender 이벤트는 좋은 내기 인 것 같습니다. 그 후 페이지의 HTML과 스크립트는 '잠겨 있습니다'.
메인 페이지에서도 Prerender 중에 호출 할 수 있습니다. 각 컨트롤의 렌더링 기능은 메인 페이지의 사전 선수 이후에 호출되므로 렌더링 기능은 안전한 장소가됩니다.