我们的用户要求让Kendo Tree显示在页面左侧面板中的MVC Web应用程序中。他们希望左手面板出现在每个屏幕上。
目前,我的_Layout.cshtml页面中有一部分呈现了剑道树:
<div>
@{Html.RenderAction("GetTree", "Tree");}
</div>
在该Action内部我进行数据库调用以获取树的内容并将模型绑定到视图,如下所示:
@model IEnumerable<TreeViewItemModel>
但很明显,使用这种模式,每次访问_Layout的页面都会被调用,树数据将再次从数据库中获取。这不是很有效。
什么是更好的方式,以便我只进行一次数据库调用?
答案 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();
}