4

いくつかの処理と消費者が設定できるいくつかのプロパティに基づいて WebControl で JavaScript を出力する必要があります。

RegisterClientScriptBlock を呼び出してページに出力できるのはいつですか?

4

4 に答える 4

6

古い質問ですが、私は最近これに対処したので、ティムの答えをもう少し明確にし、誤解を解消するために:

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

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

  • 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 の呼び出しに注目してください。それらの間で、フォームは base.RenderChildren を呼び出し、最終的にカスタム ユーザー コントロールの Render メソッドを呼び出します。したがって、元の質問に忠実であるためには、子コントロールの Render シーケンス中にいつでもスクリプトの ClientScriptBlocks 部分とやり取りすることはできません。それらは既に Response ストリームに出力されているためです。Timが言及しているように、base.Renderを呼び出す前にPageのRenderメソッドにいる場合、Renderシーケンス中にこのブロックにスクリプトを追加できますが、これはどのような子コントロールでも機能しません。

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

于 2008-12-29T22:10:13.437 に答える
3

OnPreRender

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

于 2008-10-31T12:07:54.593 に答える
1

論理的には、スタートアップ スクリプトをレンダリングするだけでなく、ページに登録する必要があるため、Page_PreRender イベントを使用することをお勧めします。その後、ページの HTML とスクリプトは「ロック」されます。

于 2008-10-31T12:12:22.617 に答える
1

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

于 2008-10-31T12:17:23.247 に答える