#asp.net #asp.net-4.0 #outputcache
#asp.net #asp.net-4.0 #outputcache
Вопрос:
У меня есть пользовательский элемент управления, для которого я хотел бы использовать кэширование вывода, но он используется несколько раз с разными данными.
Я думал об использовании VaryByCustom и попытался получить идентификатор клиента элемента управления, но не смог найти способ.
Есть ли способ кэшировать вывод usercontrol на основе идентификатора клиента или другой способ идентифицировать его по его положению в DOM?
Обновление: я попытался добавить скрытое поле и установить кэширование вывода. Для примера я установил значение скрытого поля в Datetime.Теперь, но он по-прежнему отображает один и тот же usercontrol, а не два, которые отличаются по содержимому.
<%@ OutputCache VaryByControl="hidMyField" Duration="120" %>
<asp:HiddenField runat="server" ID="hidMyField" Value="<%= Datetime.Now.ToString() %>"/>
Ответ №1:
Одним из способов может быть наличие скрытого поля на стороне сервера в элементе управления, ввести в него идентификатор клиента пользовательского элемента управления, а затем использовать параметр VaryByControl с идентификатором скрытого поля.
Для получения дополнительной информации / параметров см. Эту Ссылку MSDN, в которой обсуждается та же проблема.
Редактировать
Использование Datetime.Now.ToString()
не является хорошей идеей по двум причинам! Если вы увидите фактическое значение для различных элементов управления, вы обнаружите, что оно одинаковое, потому ToString
что будет иметь значение с точностью до секунд — все ваши экземпляры элементов управления на странице будут иметь почти одинаковое значение даты / времени, возможно, различающееся в миллисекундах, что даст одинаковое ToString()
значение.
Вторая проблема заключается в том, что DateTime.Now
она недетерминирована. Для работы кэширования вам необходимо иметь детерминированное значение (значение, которое не изменяется при повторных вызовах) — в противном случае для каждого запроса страницы у вас будет другое значение, которое приведет к аннулированию кэша. Я предлагаю ввести идентификатор клиента пользовательского элемента управления в качестве значения. Еще одним способом было бы предоставить свойство в user control и установить для него значение running number, например 1,2,3 .. со страницы.
Комментарии:
1. Я пытался сделать то, что сказал, но это не сработало (см. Обновленный вопрос).
2. Это решение, похоже, работает только с данными обратной передачи? У меня была проблема с тем, что один и тот же элемент управления дважды добавлялся на страницу, но с разными настройками. Если бы элемент управления был добавлен обычным способом (<идентификатор элемента управления =…> ), это не было бы проблемой, но мои элементы управления были добавлены в цикле с помощью LoadControl, что заставило меня столкнуться с ошибкой в asp.net . См. Дополнительную информацию и обходной путь here:devnet.kentico.com/Blogs/Martin-Hejtmanek/April-2009 /…
Ответ №2:
Вложите их в другой пользовательский элемент управления и поместите его экземпляры туда, где вы хотите, чтобы он был кэширован.