MVC3 Partial View OutputCache переопределен родительским представлением

При попытке установить другое свойство 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 не очищает свой кеш, пока родительское представление не сбрасывает его, где я надеюсь, что частичное представление очищает кеш каждые 5 секунд (а не каждые 10, как родительское представление делает). В примерах, которые я видел с использованием OutputCache в PartialView, кеш реализован в PartialView, а не в содержащем представлении. Кто-нибудь знает, является ли это ограничением кеширования в MVC3 или есть другой способ обрабатывать разные механизмы кеширования на одной странице? Заранее спасибо!


person likestoski    schedule 07.11.2011    source источник


Ответы (1)


Вы кэшировали все родительское представление на 10 секунд. Это означает, что в течение этих 10 секунд дочернее действие никогда не будет выполнено, и все представление будет обслуживаться из кеша. Даже если срок действия кеша дочернего действия истечет через 5 секунд, он все равно не будет задействован.

В ASP.NET MVC 3 поддерживается только кэширование бублика (кэшируйте часть страницы с помощью атрибута OutputCache в дочернем действии). Кэширование пончиков не поддерживается (исключите из этого кеша части кэшированной страницы).

person Darin Dimitrov    schedule 07.11.2011
comment
Спасибо, Дарин, я надеялся, что есть способ обойти это, но этот ответ имеет большой смысл. Дарнит, теперь я хочу пончики! - person likestoski; 07.11.2011
comment
Каковы некоторые из «лучших практик», когда дело доходит до кэширования вывода? Я дал этот сценарий, что кэширование всей страницы приводит к тому, что _LogOnPartial не обновляется, когда вы нажимаете ссылку выхода. - person likestoski; 08.11.2011