Использование LoadControl для отображения кэшированных WebUserControls
Это мой первый пост здесь.
Я написал 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 ответа
Мне удалось обойти эту проблему с помощью DynamicMethod. Полное описание и код можно найти в записи блога, которую я написал после того, как решил ее:
http://www.tommycode.se/2012/04/outputcache-on-dynamically-loaded.html
Кажется, у вас есть классическая проблема с кэшированием в LoadControl. Вызванный из того же места (например, для каждого цикла) в вашей программе, для того же элемента управления эта функция всегда возвращает один и тот же экземпляр, если требовался кэш. Чтобы избежать этого, в вашем случае просто сделайте 3 разных вызова - 3 разных строки кода в вашем приложении