Page.ClientScript.RegisterClientScriptBlockを呼び出すことができる絶対的な最新版はいつですか?

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

質問

処理と消費者が設定できるいくつかのプロパティに基づいて、WebControlでJavaScriptを出力する必要があります。ページのロード時にそれを行うことは早くなります。

最新の場合、RegisterClientScriptBlockを呼び出してもページに出力できますか?

役に立ちましたか?

解決

OnPreRender

または、" base.Render"を呼び出す前にRender ....をオーバーライドした場合

他のヒント

古い質問ですが、私は最近これに対処しました。そのため、Timの答えをもう少し明確にし、誤った情報を少し明確にします。

RegisterClientScriptBlockを使用している場合、スクリプトはClientScriptManager.RenderClientScriptBlocks中に出力されます。これはPage.BeginFormRender中に呼び出されますが、実際にはページ自体ではなく、フォームによって呼び出されます。

シーケンスは次のとおりです。

  • Page.ProcessRequestMain(renderセクションに到達したとき)呼び出し
  • (ページの基本クラス)を呼び出す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メソッドを呼び出します。したがって、元の質問に忠実であるために、子コントロールのRenderシーケンスは既にResponseストリームに出力されているため、スクリプトのClientScriptBlocks部分を操作することはできません。 Timが言及しているように、base.Renderを呼び出す前にページのRenderメソッドにいる場合、Renderシーケンス中にこのブロックにスクリプトを追加できますが、これはどのような種類の子コントロールでも機能しません。

Renderシーケンスのみで作業する必要がある場合(これが私がいる状況です)、RenderClientStartupScriptsはpage.EndFormRenderの間に呼び出されるため、コントロールのRenderの間にClientScript.RegisterStartupScriptを使用できます。これは 上記のコードでわかるように、コントロールはレンダリングするように指示されます。

論理的には、ページに登録するだけでなく、起動スクリプトをレンダリングする必要があるため、Page_PreRenderイベントが良い方法と思われます。その後、ページのHTMLおよびスクリプトは「ロック」されます。

メインページでも、PreRender中に呼び出すことができます。各コントロールのRender関数は、メインページのPreRenderの後に呼び出されるため、Render関数は安全な場所になります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top