Использование LoadControl для отображения кэшированных WebUserControls - PullRequest
0 голосов
/ 15 февраля 2012

Это мой первый пост здесь.

Я написал CMS, которая позволяет разработчикам писать свои собственные плагины в форме WebUserControls. Эти плагины могут быть вставлены (через TinyMCE) в контент пользователями. Это делается программно с использованием метода LoadControl, добавляя к иерархии элементов управления и устанавливая его свойства. Пока все хорошо.

Я хочу разрешить разработчикам использовать OutputCache в своих WebUserControls, однако эти элементы управления должны кэшироваться в свойствах WebUserControl. например разработчик написал WebUserControl color.ascx, который имеет свойство Color (Red | Green | Blue), поэтому в зависимости от значения этого свойства в кеше могут храниться версии Red, Green и Blue.

Проблема, с которой я столкнулся, состоит в том, что на странице может быть несколько, скажем, три элемента управления color.ascx (красный, зеленый и синий), которые динамически загружаются с помощью LoadControl. После кэширования метод LoadControl корректно возвращает PartialCachingControl, но при обновлении страницы это всегда последняя версия из кэша, т. Е. На странице отображается 3 синих вместо красных, зеленых и синих.

Есть ли способ с LoadControl (или каким-либо другим способом) загрузить правильную версию из кэша, то есть, используя свойство Color, и как я должен использовать OutputCache, чтобы убедиться, что он сохранен в кэше на основе свойств WebUserControls

Спасибо за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 13 апреля 2012

Мне удалось обойти эту проблему с помощью DynamicMethod. Полное описание и код можно найти в записи блога, которую я написал после того, как решил ее:

http://www.tommycode.se/2012/04/outputcache-on-dynamically-loaded.html

0 голосов
/ 16 февраля 2012

Кажется, у вас классическая проблема с кэшированием в LoadControl.Вызванный из того же места (например, для каждого цикла) в вашей программе, для одного и того же элемента управления эта функция всегда возвращает один и тот же экземпляр, если требовался кэш.Чтобы избежать этого, в вашем случае просто сделайте 3 разных вызова - 3 разных строки кода в вашем приложении

...