Web サイト ソリューションには、多数の asp.net カスタム サーバー コントロールがあります。これらのほとんどは、DropDownList から継承し、ストアド プロシージャを呼び出し、結果にバインドするクラス ファイルです。今、私はそれらを最適化しようとしていますが、作業を行うのに最適な場所を見つけるのに苦労しています.
ここでの目標は、db クエリを 0 回または 1 回実行することです。
ゼロ: カスタム サーバー コントロールを含む一部のページは、変数に基づいてページの読み込み時に実際に非表示になります。そのため、バインディング コードをコントロールのページ ロード (またはページの初期化) に配置すると、ホスティング ページがそれを表示しなくても起動し、不要な場合はクエリ作業を実行したくありません。
ONE: それで、コントロールの RenderContents イベントをオーバーライドすることでバインディングを行うことを実験しました。ホスティング ページがコントロールを非表示にすると、そのイベントが発生しないという点で、これで問題が解決したようです。ただし、コントロールがページに表示されている場合は、コントロールが起動し、コントロールがバインドされます。しかし...ポストバックごとに発生し、dbクエリを1回だけ実行したい。したがって、通常は、最初は DataTable を ViewState に格納し、その後はそれを使用します。
しかし、私のテストでは、RenderContents メソッドで ViewState を設定すると、それ以降のポストバックには存在しないように見えます (以下のコード サンプルを参照)。そして、毎回データベース検索が行われます(これは私が避けようとしているものです)。
.NET がそれに注意を払うには、ページ イベントのライフサイクルが遅すぎると思います。
どんなガイダンスも大歓迎です!
protected override void RenderContents(System.Web.UI.HtmlTextWriter writer)
{
buildList();
base.RenderContents(writer);
}
private void buildList()
{
DataTable dt;
if (ViewState["data"] == null)
{
dt = GetData(); // assume this executes a stored proc on SQL Server and returns a DataTable of results
ViewState["data"] = dt;
}
else
{
dt = (DataTable)ViewState["data"];
}
this.DataSource = dt;
this.DataTextField = "Description";
this.DataValueField = "ID";
this.DataBind();
}