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