我如何知道是否正在使用给定控件的OutputCache?

时间:2009-07-09 14:10:42

标签: asp.net-mvc user-controls outputcache

我正在尝试在Asp.Net MVC中编写一个通用的“menu.ascx”usercontrol,它将为我的应用程序生成格式正确的HTML菜单。该菜单基于数据库中的内容和一系列资源分辨率生成,这些分辨率通过ViewModel上的属性传递给PartialView。

在menu.ascx控件上使用OutputCache指令是有意义的,以限制数据库和资源文件的往返次数。我的目的是使用VaryByParam = none和VaryByCustom属性标记OutputCache指令,在global.asax中实现自定义安全性查找...

我的问题是:我们如何知道何时使用outputCache for menu.ascx,以便在控制器中构建ViewModel时可以跳过数据获取操作?


一些示例UserControl代码:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl"  %>
<%@ OutputCache VaryByParam="none" VaryByCustom="customstring" %>
<ul>
<% var model = (IMyViewModel)Model; 
 foreach (var menu in model.Menus) { %>
   <li><a href="<%= menu.href %>"><%= menu.Text %></a></li>
<% } %>
</ul>

2 个答案:

答案 0 :(得分:1)

这里有关于该主题Donut Hole Caching in ASP.NET MVC以及此处ASP.NET MVC Result Cache的有趣读物,我基本上会通过主页中的RenderAction方法执行此菜单来调用将从数据库和theb中提取数据的操作,然后缓存行动结果

答案 1 :(得分:0)

我想我找到了适合我的问题的解决方法。

在我的具体ViewModel实现的Menus属性getter中,我正在编写代理代码以返回实例化Controller并请求Menu数据。通过这种方式,我可以在PartialView请求时即时创建菜单数据。如果PartialView来自OutputCache,则不会请求Menu属性。

所以,我的IMyViewModel看起来有点像这样:

public interface IMyViewModel {

  IEnumerable<Menu> Menus { get; }

  ///<summary>
  /// A pointer back to the calling controller, which inherits from the abstract MyBaseController
  ///</summary>
  MyBaseController Controller { get; set; }

}

我对Menus的具体实现看起来有点像这样:

public IEnumerable<Menu> Menus 
{
   get { return Controller.GetMenus(); }
}

评论?这是一个可行的解决方案吗?