Вариант 1: Использовать Output Cache Substitution Feature
Атрибут OutputCache
— это надстройка над механизмом кеширования старого доброго ASP.NET (во всяком случае для MVC версии 1.0). Поэтому все расширенные техники кеширования базируются также на старых asp.net`овских фишках.
Так, частичное кеширование работает за счет механизма Output Cache Substitution Feature (Подробнее можно прочитать в классическом опусе Tip/Trick: Implement "Donut Caching" with the ASP.NET 2.0 Output Cache Substitution Feature).
Были созданы MVC-обертки над механизмом Output Cache Substitution (Еще более классический опус: Donut Caching in ASP.NET MVC). Сейчас (версия MVC 1.0) эти обертки можно найти в ASP.NET MVC Futures. Расширения и хелперы позволяют писать конструкции вида:
<!-- Это кешируется (атрибут OutputCache применен к конроллеру) -->
<%= DateTime.Now %>
<!-- Это не кешируется -->
<%= Html.Substitute(c => DateTime.Now.ToString()) %>
Однако, такой подход имеет серьезный недостаток. Делегат, который возвращает динамические данные должен работать без контекста. То есть он не может обращаться к ViewData
или TempData
. В принципе это логично, потому что когда страница достается из кеша, никаких данных, передаваемых контроллером, она уже не имеет. Отсюда следует, что Html.Substitute()
подходит только для вывода даты генерации страницы, но никак не для частичного кеширования. Есть способ подружить Html.Substitute() с TempData, но на бОльшее расчитывать не приходится.