【发布时间】:2014-01-14 08:30:08
【问题描述】:
我在一个动作上使用OutputCache(Duration = 60),默认情况下我认为用@Html.Action("ActionName", "ControllerName") 渲染的子动作不会被缓存,除非用OutputCache 注释?这适用于 MVC 2,但似乎不适用于 MVC 3。如果这种情况发生了变化,我将如何将页面的一部分设置为不缓存?
谢谢
【问题讨论】:
标签: asp.net-mvc-3
我在一个动作上使用OutputCache(Duration = 60),默认情况下我认为用@Html.Action("ActionName", "ControllerName") 渲染的子动作不会被缓存,除非用OutputCache 注释?这适用于 MVC 2,但似乎不适用于 MVC 3。如果这种情况发生了变化,我将如何将页面的一部分设置为不缓存?
谢谢
【问题讨论】:
标签: asp.net-mvc-3
我不确定,但这看起来很相似,也许会有所帮助:
【讨论】:
这个问题很无奈。似乎子动作的持续时间应该能够设置为 0,就像正常动作一样,但是因为它必须是大于 0 的正整数,所以如果您尝试将子操作的持续时间设置为 0。为了解决这个问题,我使用以下属性装饰子操作:
[ChildActionOnly]
[OutputCache( Duration = 1, VaryByCustom="Always")]
然后我通过添加以下方法在 Global.asax.cs 中设置始终自定义输出缓存:
public override string GetVaryByCustomString(HttpContext context, string arg)
{
if (arg == "Always")
{
return DateTime.Now.Ticks.ToString();
}
return String.Empty;
}
基本上,第一个属性告诉 MVC 这是一个子操作(无法从应用程序外部访问)。第二个属性是将缓存保存 1 秒(子操作允许的最小值)并根据我的自定义始终缓存来改变缓存。在 global.asax.cs 中的方法中,我试图使返回的值足够独特,以至于它在缓存发生的一秒钟内永远找不到它。不是防弹的,但应该适用于没有大量流量的网站。
【讨论】: