Page.ClientScript.RegisterClientScriptBlockを呼び出すことができる絶対的な最新版はいつですか?
-
05-07-2019 - |
質問
処理と消費者が設定できるいくつかのプロパティに基づいて、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関数は安全な場所になります。