2

我正在尝试在 Asp.Net MVC 中编写一个通用的“menu.ascx”用户控件,它将为我的应用程序生成一个格式正确的 HTML 菜单。菜单是根据数据库中的内容和一系列资源解析生成的……通过 ViewModel 上的属性传递给 PartialView。

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

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


一些示例用户控件代码:

<%@ 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>
4

2 回答 2

1

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

于 2009-07-09T20:35:41.883 回答
0

我想我已经找到了一个合适的解决方法来解决我的问题。

在具体 ViewModel 实现的 Menus 属性获取器中,我正在编写代理代码以返回到实例化控制器并请求菜单数据。通过这种方式,我可以在 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(); }
}

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

于 2009-07-10T11:46:31.950 回答