如何将ASP.NET菜单控件放入缓存?

时间:2011-10-04 20:02:30

标签: asp.net sharepoint-2010 menu

我有一个SharePoint2010网站,我已经为其创建了一个ASP.NET菜单控件。 ASP.NET菜单的内容最初是空的,在Page_Load上我从服务器上的标准HTML文件加载其内容:

           protected void Page_Init(object sender, EventArgs e)
        {
            string MenuPath = (string)ConfigurationSettings.AppSettings["RootMenuPath"].ToString();

            Menu1.Items[0].ChildItems[0].Text = File.ReadAllText(MenuPath + "\\About.htm");
//etc...
}

我注意到这是一种可怕的做事方式。每次用户加载页面时都会访问磁盘。

我怎么能:

a)缓存代码和asp.net菜单项,使其保留在内存中?

b)使用另一种方法确保它没有从磁盘加载?

由于

3 个答案:

答案 0 :(得分:1)

您可以将数据加载到属性中并至少使用页面缓存:

 readonly object cacheLock = new object();
string AboutHTM
{
    get
    {
        if (Cache.Get("page.about") == null)
            lock (cacheLock)
            {
                if (Cache.Get("page.about") == null)
                    Cache.Insert(File.ReadAllText(MenuPath + "\\About.htm"));
            }
        return Cache["page.about"].ToString();
    }
}

答案 1 :(得分:0)

你确实可以使用缓存或在Application_Start中只初始化一次并稍后重用的变量,但我担心你在这里做了一些过早的优化。除非您发现这是应用程序性能的瓶颈,否则您可能不应该这样做。从磁盘读取文件是一种快速操作,特别是如果它们很小的话。

答案 2 :(得分:0)

如果可能,我会将菜单数据存储在XML文件中,并缓存XML文件。

XmlDocument xDoc = new XmlDocument();

if (Cache.Get("MenuData") == null)
{
    xDoc.Load(Server.MapPath("/MenuData.xml"));
    Cache.Insert("SiteNav", xDoc, new CacheDependency(Server.MapPath("/MenuData.xml")));
}
else
{
    xDoc = (XmlDocument)HttpContext.Current.Cache.Get("MenuData");
}