2009-07-09 75 views
2

我正在尝试在Asp.Net MVC中编写一个常见的“menu.ascx”usercontrol,它将为我的应用程序生成格式正确的HTML菜单。该菜单是根据数据库中的内容和一系列资源分辨率生成的,它们通过ViewModel上的属性传递给PartialView。如何知道给定控件的OutputCache是​​否正在使用?

在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> 

回答

0

我想我已经找到了合适的解决办法,以我的问题。

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

} 

和我的具体执行菜单看起来有点像这样:

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

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

1

下面是关于这个问题的有趣的阅读下载Donut Hole Caching in ASP.NET MVC这里ASP.NET MVC Result Cache,我就基本上做到通过的RenderAction方法本功能,母版页调用操作将从中提取数据数据库和theb,然后缓存作用的结果

+0

RenderAction仅适用于ASP.Net MVC期货...我不确定我们是否想要去那里。 – 2009-07-10 11:47:36

相关问题