現在の設計アプローチでは、コントロールに対して追加のデータベース読み取りとデータバインドを実行する必要があり、ページのライフサイクルの後半でそれらを上書きする必要がある場合があります。ユーザーへの最終結果は同じですが、舞台裏では2つの不要でコストのかかる操作を行っています。
検索ボタンはマスターページにあります。すべての表示コントロール(グリッドビュー/テーブル/ラベルなど)はコンテンツページにあります。データベース呼び出しとデータバインディングは、Page_Init()メソッドで実行する必要があります(使用されているコントロールのほとんどはここでバインドする必要があります)。
ユーザーがアイテムを検索するとき、セッションに検索入力を保存して、他のすべてのコンテンツページでアクティブに表示されているように保持します。コンテンツページが初期化されたときに、それらがアイテムをアクティブに表示しているかどうかを確認し、表示している場合はその詳細を表示するようにします。
// Master Page
protected void BtnSearch_OnClick(object sender, EventArgs e)
{
MySession.Current.ItemName = TxtItem.Text.Trim();
Server.Transfer("~/default.aspx");
}
// Content Page
protected void Page_Init(object sender, EventArgs e)
{
// If they're actively viewing an item, display its info
bool HasActiveItem = string.IsNullOrEmpty(MySession.Current.ItemName) ? false : true;
if (HasActiveItem)
{
// Makes one DB call to get all info;
// Binds all that info to GridViews/tables/labels on the page
BindAllDataControls(MySession.Current.ItemName);
// Display
DisplayItemDetails();
}
}
問題は次のとおりです。ユーザーが現在アイテム=ブーツを表示しているとします。この値はセッションに保存されます。ここで、ユーザーはItem = Shirtsを検索し、検索ボタンをクリックします。
コンテンツページが読み込まれると、セッションに何かがあるかどうかを確認しますが、そこにはItem=Bootsがあります。不要なデータベース/データバインド呼び出しを実行します。次に、BtnSearchクリックイベントがトリガーされ、新しいItem = Shirts値がセッションに読み込まれ、ライフサイクルが最初からやり直されます。このライフサイクルは順調です。
どうすればその余分な処理を取り除くことができますか?アプローチは間違っていますか?
コンテンツページの初期化中にPage.IsPostback()およびPage.IsCallback()ロジックを実行することを考えましたが、実際のWebアプリケーションでポストバックとコールバックを引き起こす他の複数のコントロールがあります。したがって、これからスキップするかどうかを決定するのに十分な情報を得ることができないと思います。すべてのGridView/テーブル/ラベルなどを含むページ全体をラップすることを考えました。ajaxコールバックではありますが、それは良いアプローチではないと思います。フラグを設定するBtnSearchクリック中にajaxコールをサーバーに送り返すことを考えました。次に、ロード中にそのフラグを読み取ってスキップするかどうかを確認しますが、検索BtnClickイベントの前にそのajax呼び出しが処理されるという保証はありません。
何か案は?それとも、これらの余分な呼び出しを食べて、それで終わらせる必要がありますか?別の方法が必要です。