いくつかの処理と消費者が設定できるいくつかのプロパティに基づいて WebControl で JavaScript を出力する必要があります。
RegisterClientScriptBlock を呼び出してページに出力できるのはいつですか?
いくつかの処理と消費者が設定できるいくつかのプロパティに基づいて WebControl で JavaScript を出力する必要があります。
RegisterClientScriptBlock を呼び出してページに出力できるのはいつですか?
古い質問ですが、私は最近これに対処したので、ティムの答えをもう少し明確にし、誤解を解消するために:
求めているように RegisterClientScriptBlock を使用すると、スクリプトは ClientScriptManager.RenderClientScriptBlocks 中に出力されます。これは Page.BeginFormRender 中に呼び出されますが、実際にはページ自体ではなくフォームによって呼び出されます。
シーケンスは次のとおりです。
リフレクター より:
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 シーケンス中にいつでもスクリプトの ClientScriptBlocks 部分とやり取りすることはできません。それらは既に Response ストリームに出力されているためです。Timが言及しているように、base.Renderを呼び出す前にPageのRenderメソッドにいる場合、Renderシーケンス中にこのブロックにスクリプトを追加できますが、これはどのような子コントロールでも機能しません。
Render シーケンスだけで作業する必要がある場合 (これが私がいる状況です)、RenderClientStartupScripts が page.EndFormRender 中に呼び出されるため、コントロールの Render 中に ClientScript.RegisterStartupScript を使用できます。上記のコードでわかるように、レンダリングします。
OnPreRender
または、「base.Render」を呼び出す前に Render.... をオーバーライドする場合
論理的には、スタートアップ スクリプトをレンダリングするだけでなく、ページに登録する必要があるため、Page_PreRender イベントを使用することをお勧めします。その後、ページの HTML とスクリプトは「ロック」されます。
メインページでも、PreRender 中に呼び出すことができます。各コントロールの Render 関数は、メイン ページの PreRender の後に呼び出されるため、Render 関数は安全な場所になります。