【问题标题】:How to load TreeView data only once in a _Layout page如何在 _Layout 页面中仅加载一次 TreeView 数据
【发布时间】:2014-10-02 23:12:33
【问题描述】:

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

目前我的 _Layout.cshtml 页面有一个部分用于呈现剑道树:

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

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

@model IEnumerable<TreeViewItemModel>

但显然,在这种模式下,我转到 _Layout 的每个页面都会被调用,并且树数据会再次从数据库中获取。这不是很有效。

有什么更好的方法可以让我只调用一次数据库?

【问题讨论】:

  • 每个页面和每个用户的树的内容是否相同?
  • 在某个地方放置一个 if(TreeViewItemModel == null),无论它被加载到哪里,都包含某种类型的缓存

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


【解决方案1】:

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

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

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

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();
}

【讨论】:

  • 内容因用户所属的公司而异,但我将 CompanyId 存储在 Session 中并使用它进行数据库调用以获取 Tree 数据。
  • 我知道缓存是一种选择,同时也在寻找人们是否有其他可能更适合这种情况的想法或模式,比如可能根本不使用 _Layout设计
  • 所以缓存可能是一种选择,但必须按公司分开
  • @cktech 我已添加到我的答案中,以展示如何缓存 TreeViewModelItems 的整个集合,但只提取相关公司的记录。您还可以按公司 ID 单独缓存,方法是为每个包含公司 ID 的缓存集合使用计算键。还有许多其他可能的设置方法。
  • 我还没有实现缓存解决方案,但是这个答案听起来很合理并且确实停止了多个数据库命中。谢谢你,安。
猜你喜欢
  • 2018-12-18
  • 2017-01-04
  • 1970-01-01
  • 2021-08-23
  • 1970-01-01
  • 2012-07-06
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
相关资源
最近更新 更多