2012-03-15 82 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,而不是经典ASP – 2012-03-15 18:14:20

回答

1

考虑缓存或重新处理您的数据库查询。缓存菜单可能会导致通过ViewState将更多数据存储在服务器或客户端上。菜单的来源是你的数据,所以你应该从那里开始。

+0

我正在缓存数据库查询的结果,但处理这些结果是花费时间。我了解ViewState命中,我也想避免这种情况。现在我正处于两个世界中最糟糕的状态。这是一个ASP控件,所以它在ViewState中结束并且我从缓存的查询中重建它。我希望它会持续下去。 – 2012-03-22 21:31:08

+0

Bob,“LoadPageMenu”方法需要1.2秒?看到代码会很有趣。 – andleer 2012-03-23 14:46:15

1

将构建菜单的实际数据存储在缓存中,并且每次从该缓存数据构建菜单。禁用视图状态以节省性能。不要自行存储菜单或菜单项。

+0

这正是我目前正在做的,但需要将近1.2秒来重新生成控件...因此,这篇文章。我想找出如何缓存控制。 – 2012-03-22 21:28:54

+0

@BobJones上面的代码是?那么为什么你要清除列表中的项目?如果您禁用viewstate并在每次回发中添加项目,那应该会更快。如果没有,另一个选择是你可以将它绑定到XML,如下所述:http://msdn.microsoft.com/en-us/library/ecs0x9w5(v=vs.80).aspx所以你可以转换它第一次到XML,然后onpostback,尝试转换它。 – 2012-03-23 00:18:00