Page.ClientScript.RegisterClientScriptBlock을 호출할 수 있는 가장 늦은 시간은 언제입니까?

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

문제

일부 처리 및 소비자가 설정할 수 있는 일부 속성을 기반으로 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 중에 호출 할 수 있습니다. 각 컨트롤의 렌더링 기능은 메인 페이지의 사전 선수 이후에 호출되므로 렌더링 기능은 안전한 장소가됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top