如何在_Layout页面中仅加载一次TreeView数据

时间:2014-10-02 23:12:33

标签: asp.net-mvc kendo-asp.net-mvc kendo-treeview

我们的用户要求让Kendo Tree显示在页面左侧面板中的MVC Web应用程序中。他们希望左手面板出现在每个屏幕上。

目前,我的_Layout.cshtml页面中有一部分呈现了剑道树:

<div>
  @{Html.RenderAction("GetTree", "Tree");}
</div>

在该Action内部我进行数据库调用以获取树的内容并将模型绑定到视图,如下所示:

@model IEnumerable<TreeViewItemModel>

但很明显,使用这种模式,每次访问_Layout的页面都会被调用,树数据将再次从数据库中获取。这不是很有效。

什么是更好的方式,以便我只进行一次数据库调用?

1 个答案:

答案 0 :(得分:1)

我将假设树的内容对于每个页面和每个用户都是相同的。

在这种情况下,您可以缓存检索到的数据库数据,这样您就不必在每个页面渲染上检索它。有很多方法可以缓存它:最简单的方法是使用ASP.NET自带的缓存,详细描述(使用演练)here

你可能仍然需要在每个页面上呈现它(除非你想进入部分页面缓存,我不确定它在MVC中是如何工作的)但是你绝对可以避免重复的数据库命中。 / p>

ETA:您可以创建一个包装器或帮助器类,以便按公司检索必要的树数据。相关方法看起来有点像这样:

public IEnumerable<TreeViewItemModel> GetCachedTreeDataByCompany(int companyId)
{
    var data = Cache["TreeData"] as IEnumerable<TreeViewItemModel>;
    if(data == null)
    {
        data = GetTreeData();  // whatever you need to do to get the data
        Cache.Insert("TreeData", data);
    }
    return data.Where(tvim => tvim.CompanyId == companyId).ToArray();
}