Вариант 2: Частичный рендеринг и кеширование
Как известно, в ASP.NET MVC предусмотрена возможность частичного рендеринга страницы при помощи хелпера Html.RenderAction
. Этот метод встраивает в страницу результат работы определенного action-метода. Сама концепция RenderAction, пришедшая из Ruby, является порочной (не зря из Ruby ее давно выкинули), потому что перемещает логику формирования результата из контроллера в вид. Однако, есть академически чистый аналог RenderAction — это SubController из MvcContrib.
Используя RenderAction
или SubController
в связке со стандартным механизмом кеширования (атрибут OutputCache
). Можно организовать кеширование части страницы. Для этого нужно:
- выделить динамическую часть в отдельный action,
- пометить этот action атрибутом
OutputCache
- выводить результат на странице с помощью RenderAction или SubController.
К сожалению, такое решение не будет работать, потому что ASP.NET закеширует всю страницу целиком, а не ее часть. Это известная проблема, но в ASP.NET MVC 1.0 она не решена. Есть два способа борьбы с этим багом:
- Использовать решение, описанное в статье Donut Hole Caching in ASP.NET MVC. Недостатки — работает только для
WebFormsViewEngine
и требует неочевидных изменений в видах. - Отказаться от стандартного атрибута
OutputCache
и использовать свой аналогичный атрибут. Например такой, как описан в статье Partial Output Caching in ASP.NET MVC)