Изменять кеширование вывода при управлении пользователем по идентификатору клиента

У меня есть пользовательский элемент управления, для которого я хотел бы использовать кеширование вывода, но он используется несколько раз с разными данными.

Я подумал об использовании VaryByCustom и попытался получить ClientID элемента управления, но не смог найти способ.

Есть ли способ вывести в кэш пользовательского элемента управления на основе ClientID или другой способ идентифицировать его по его положению в DOM?

Обновление: я попытался добавить скрытое поле и настроить кеширование вывода. В этом примере я установил для скрытого поля значение Datetime.Now, но он по-прежнему отображает тот же элемент управления пользователем, а не два, которые отличаются по содержанию.

<%@ OutputCache VaryByControl="hidMyField" Duration="120" %>
<asp:HiddenField runat="server" ID="hidMyField" Value="<%= Datetime.Now.ToString() %>"/>

person Dofs    schedule 05.10.2011    source источник


Ответы (2)


Один из способов - создать скрытое поле на стороне сервера в элементе управления, вставить в него идентификатор клиента пользовательского элемента управления и затем использовать параметр VaryByControl со скрытым идентификатором поля.

Для получения дополнительной информации и опций см. эту ссылку MSDN, в котором обсуждается та же проблема.

РЕДАКТИРОВАТЬ
Использование Datetime.Now.ToString() - не лучшая идея по двум причинам! Если вы видите фактическое значение для различных элементов управления, вы обнаружите, что оно одинаковое, потому что ToString будет иметь значение до секунд - все ваши экземпляры элементов управления на странице будут иметь почти одинаковое значение даты / времени, вероятно, различающееся в миллисекундах, что будет дают то же значение ToString().
Вторая проблема заключается в том, что DateTime.Now недетерминирован. Чтобы кеширование работало, вам необходимо иметь детерминированное значение (значение, которое не меняется при повторных вызовах) - в противном случае для каждого запроса страницы у вас будет другое значение, которое сделает кеш недействительным. Я предлагаю указать идентификатор клиента пользовательского элемента управления в качестве значения. Еще один способ - предоставить свойство в пользовательском элементе управления и установить для него текущий номер, например 1,2,3 .. со страницы.

person VinayC    schedule 05.10.2011
comment
Я пытался сделать то, что сказал, но это не сработало (см. Обновленный вопрос). - person Dofs; 06.10.2011
comment
Это решение работает только с данными обратной передачи? У меня была проблема с тем, что один и тот же элемент управления дважды добавлялся на страницу, но с разными настройками. Если бы элемент управления был добавлен обычным способом (‹Control id = ...›), это не было бы проблемой, но мои элементы управления были добавлены в цикл с LoadControl, из-за чего я столкнулся с ошибкой в ​​asp. сеть. См. Дополнительную информацию и обходной путь здесь: devnet.kentico.com/Blogs/Martin-Hejtmanek/April-2009/ - person tommycode; 12.04.2012

Вложите их в другой пользовательский элемент управления и поместите его экземпляры везде, где вы хотите, чтобы они были кэшированы.

person Muhammad Hasan Khan    schedule 05.10.2011