1

現在の設計アプローチでは、コントロールに対して追加のデータベース読み取りとデータバインドを実行する必要があり、ページのライフサイクルの後半でそれらを上書きする必要がある場合があります。ユーザーへの最終結果は同じですが、舞台裏では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呼び出しが処理されるという保証はありません。

何か案は?それとも、これらの余分な呼び出しを食べて、それで終わらせる必要がありますか?別の方法が必要です。

4

1 に答える 1

1

ここで私が見ている最も簡単な解決策は、検索テキストの変更のチェックを、ボタン呼び出しではなく、PageInitで直接行うことです。

// Master Page
protected void BtnSearch_OnClick(object sender, EventArgs e)
{
   // remove that lines
   // MySession.Current.ItemName = TxtItem.Text.Trim();
   // Server.Transfer("~/default.aspx");
}

// Content Page
protected void Page_Init(object sender, EventArgs e)
{
   // direct add here your variable on session
   var vSearchText = TxtItem.Text.Trim();

   if(!string.IsNullOrEmpty(vSearchText))
       MySession.Current.ItemName = vSearchText ;

   // ------------ rest of your code ---------------    
   // 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();
   }
}

実を言うと、Server.Transferは良い考えではありません。私が行うことは、URLにパラメーターを使用して、ユーザーの入力からの検索文字列を含めることです。したがって、ユーザーが検索用に何かを追加するときは、次のようにURLを作成します。

http://www.mydomain.com?q=test

次に、を読み、qそれを使用して検索ボックスに入力し、検索を行います。このようにして、SEOに適した検索も可能になり、ユーザーは検索を保存でき、他の問題があるサーバー転送を回避できます。

于 2013-02-24T20:24:00.420 に答える