2012-03-15 7 views
0

System.Web.UI.WebControls.Menuを使用して、ユーザーメニューを作成して表示します。メニューをロードするにはかなりのデータベース操作が必要で、約1.4秒かかります。そのため、ページめくりの間にメニューをキャッシュする方法を探しています。メニューコントロールを含むSessionVariable ["ThisMenu"]を保持すると、ThisMenuの値はページターンの間で正しいです。ただし、ページ上の実際のコントロールを正常に設定することはできません。ASP.NETメニューコントロールのキャッシュ

私はこのコードをしようとすると、それはコンパイルおよび実行されますが、何もHTML出力に表示されていない:

System.Web.UI.WebControls.Menu ctlMasterMenu = (System.Web.UI.WebControls.Menu)GetControl("ctlMasterMenu"); 
if (ctlMasterMenu != null) 
{ 
    if (ThisMenu != null) 
    { 
     ctlMasterMenu = ThisMenu; 
    } 
    else 
    { 
     LoadPageMenu((System.Web.UI.WebControls.Menu)ctlMasterMenu); // Sets ThisMenu 
    } 
} 

If I try this code, it executes, but as it adds a MenuItem to ctlMasterMenu, it removes the item from ThisMenu. The result is that after a few page turns, the menu is empty. 

System.Web.UI.WebControls.Menu ctlMasterMenu = (System.Web.UI.WebControls.Menu)GetControl("ctlMasterMenu"); 
if (ctlMasterMenu != null) 
{ 
    if (ThisMenu != null) 
    { 
     List<MenuItem> items = new List<MenuItem>(); 
     for (int i = 0; i < ThisMenu.Items.Count; i++) 
     { 
      items.Add(ThisMenu.Items[i]); 
     } 
     ctlMasterMenu.Items.Clear(); 
     foreach (MenuItem item in items) 
     { 
      ctlMasterMenu.Items.Add(item); // Causes item to be removed from ThisMenu 
     } 
    } 
    else 
    { 
     LoadPageMenu((System.Web.UI.WebControls.Menu)ctlMasterMenu); 
    } 
} 

作品の簡単な方法があるに違いありません。

+0

これは.NETで、Classic ASPではありません –

答えて

1

データベースクエリのキャッシュまたは再作成を検討してください。メニューをキャッシュすると、ViewState経由でサーバーまたはクライアントに追加データを格納する可能性が高くなります。メニューのソースはあなたのデータなので、そこから始めてください。

+0

私はデータベースクエリの結果をキャッシュしていますが、その結果を処理するには時間がかかります。私はViewStateのヒットを理解しており、私もそれを避けたい。今、私は両方の世界の中で最悪の状況に陥っています。これはASPコントロールなので、ViewStateに巻き上げられ、キャッシュされたクエリから再構築されます。私はそれがそのまま続くことを望む。 –

+0

Bob、 "LoadPageMenu"メソッドは1.2秒かかりますか?そのコードを見るのは面白いだろう。 – andleer

1

キャッシュにメニューを構築する実際のデータを格納し、このキャッシュされたデータから毎回メニューを構築します。パフォーマンスを節約するためにviewstateを無効にします。メニューやメニュー項目自体は保存しないでください。

+0

これはまさに私が現在やっていることですが、コントロールを再生するのにおよそ1.2秒かかります。私はどのようにコントロールをキャッシュするかを知りたい。 –

+0

@BobJonesそれは上のコードですか?なぜあなたはリストからアイテムをクリアしていますか? viewstateを無効にして、すべてのポストバックにアイテムを追加すると、それはより速くなるはずです。そうでない場合、もう1つの選択肢は、ここに記載されているようにXMLにバインドできることです。http://msdn.microsoft.com/en-us/library/ecs0x9w5(v=vs.80).aspx初めてXMLに変換してから、onpostbackで変換してみてください。 –

関連する問題