缓存ASP.NET菜单控件

时间:2012-03-15 17:44:59

标签: asp.net caching menu

我使用System.Web.UI.WebControls.Menu来构建和呈现用户菜单。加载菜单需要大量的数据库活动,大约需要1.4秒,所以我正在寻找在页面转换时缓存菜单的方法。如果我保留包含菜单控件的SessionVariable [“ThisMenu”],则在页面转换时ThisMenu的值是正确的;但是,我无法成功地在页面上设置实际控件。

如果我尝试使用此代码,它会编译并执行,但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);
    }
}

必须有一种简单的方法。

2 个答案:

答案 0 :(得分:1)

考虑缓存或重新编写数据库查询。缓存菜单可能会导致通过ViewState在服务器或客户端上存储其他数据。菜单的来源是您的数据,因此您应该从那里开始。

答案 1 :(得分:1)

将构建菜单的实际数据存储在缓存中,并且每次从此缓存数据构建菜单。禁用viewstate以节省性能。不要自己存储菜单或菜单项。