【问题标题】:MVC3 Partial View OutputCache overridden by parent viewMVC3 部分视图 OutputCache 被父视图覆盖
【发布时间】:2011-12-23 16:27:37
【问题描述】:

当尝试在局部视图上设置不同的 OutputCache 属性时,我发现 PartialView 缓存正在使用父级输出缓存持续时间。使用以下代码,我希望 RenderPartial 会导致更短的 OutputCache 持续时间,但我发现它与父视图相同(10 秒)

public class HomeController : Controller
{
    [OutputCache(Duration=10, VaryByParam="none")]
    public ActionResult Index()
    {
        ViewBag.Message = "Time now: "+ DateTime.Now.ToString();

        return View();
    }

    [ChildActionOnly]
    [OutputCache(Duration=5, VaryByParam="none")]
    public PartialViewResult LogonPartial()
    {
        return PartialView("_LogOnPartial");
    }
}

通过这个在局部视图中显示 DateTime.Now 的简单示例,我发现 PartialView 不会清除它的缓存,直到父视图刷新他的位置,我希望 Partial 视图每 5 秒清除一次缓存(而不是每 10 秒)父视图确实如此)。在我看到的在 PartialView 上使用 OutputCache 的示例中,缓存是在 PartialView 而不是包含视图上实现的。有谁知道这是否是 MVC3 中缓存的限制,或者是否有另一种方法来处理同一页面上的不同缓存机制?提前致谢!

【问题讨论】:

    标签: asp.net-mvc-3 caching scalability data-caching


    【解决方案1】:

    您已将整个父视图缓存了 10 秒。这意味着在这 10 秒内,子操作永远不会被命中,整个视图将从缓存中提供。即使子动作的缓存在 5 秒后过期,它仍然不会被命中。

    在 ASP.NET MVC 3 中,仅支持环形孔缓存(通过使用子操作的 OutputCache 属性缓存页面的一部分)。不支持环形缓存(从该缓存中排除缓存页面的一部分)。

    【讨论】:

    • 谢谢达林,我曾希望有办法解决这个问题,但这个答案很有意义。 Darnit 现在我想要甜甜圈!
    • 在输出缓存方面有哪些“最佳实践”?我已经给出了这种情况,缓存整个页面会导致 _LogOnPartial 在您点击注销链接时不刷新。
    猜你喜欢
    • 2017-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-15
    相关资源
    最近更新 更多