1

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();
    }
4

0 に答える 0