-
Вы можете использовать элемент управления «Замена» для создания областей на веб-странице, которые можно динамически обновлять и впоследствии интегрировать в кэшированные страницы.
1. План
Используйте элемент управления «Замена», чтобы указать части веб-страницы, где вы хотите кэшировать выходные данные динамического содержимого. Для страниц, на которых большая часть содержимого кэшируется, элемент управления «Подстановка» предоставляет упрощенное решение для частичного кэширования страниц. Вы можете кэшировать выходные данные всей страницы, а затем использовать элемент управления «Подстановка», чтобы указать части страницы, которые не кэшируются. Область кэша выполняется только один раз и будет считываться из кэша до тех пор, пока запись кэша не истечет или не будет очищена. Динамические регионы выполняются каждый раз, когда запрашивается страница. Эта модель кэширования упрощает кодирование веб-страниц, содержимое которых в основном статично, поскольку вам не нужно инкапсулировать это статическое содержимое в пользовательский веб-элемент управления, чтобы поместить его в кэш. Например, эта модель кэширования полезна для веб-страниц, содержащих статическое содержимое (например, новости), а также для элемента управления AdRotator, отображающего рекламные объявления. Новости меняются нечасто, а это значит, что их можно кэшировать. Возможно, вы захотите показывать новое объявление каждый раз, когда пользователь запрашивает страницу. Элемент управления AdRotator напрямую поддерживает замену после кэширования, которая отображает новое объявление при каждой обратной передаче веб-страницы независимо от того, кэширована ли веб-страница.
2. Предыстория
При кэшировании веб-страницы ASP.NET по умолчанию кэшируется весь вывод страницы. По первому запросу страница запустится, а ее вывод будет кэширован. Для последующих запросов это будет выполняться посредством кеширования, и код на этой странице не будет выполняться.
В некоторых случаях вам может потребоваться не только кэшировать веб-страницу ASP.NET, но и обновлять выбранные части страницы каждый раз, когда страница запрашивается. Например, вы можете захотеть кэшировать большую часть страницы, но вам необходимо динамически обновлять очень чувствительную ко времени информацию на странице.
Вы можете использовать элемент управления «Замена» для вставки динамического содержимого в кэшированные страницы. Элемент управления «Замена» не отображает никакой разметки. Поэтому вам необходимо привязать элемент управления к методу на веб-странице или к родительскому пользовательскому элементу управления. Вам необходимо создать статические методы, которые возвращают информацию для вставки на веб-страницу. Методы, вызываемые элементами управления подстановкой, должны соответствовать следующим критериям:
·Должен быть статический метод (общий в Visual Basic).
·Должен принимать параметры типа HttpContext.
·Должен возвращать значение типа String.
Элемент управления «Замена» не имеет доступа к другим элементам управления на веб-странице, а это означает, что вы не можете проверять или изменять значения других элементов управления. Однако код может получить доступ к контексту текущей страницы, используя переданные ему параметры.
При запуске страницы элемент управления Substitution вызывает этот метод, а затем заменяет элементы управления Substitution на странице возвращаемым значением метода.
пример кода
В следующем примере показано, как использовать элемент управления «Подстановка» для создания динамически обновляемого содержимого на кэшированной странице. Код в событии Load страницы обновляет элемент управления Label, используя текущее время. Поскольку продолжительность кэша страницы установлена на 60 секунд, текст элемента управления Label не изменяется, даже если страница запрашивается несколько раз в течение 60-секундного периода. Элемент управления Substitution на странице вызывает статический метод GetTime, который возвращает текущее время в виде строки. Каждый раз, когда веб-страница обновляется, значение, представленное элементом управления «Замена», обновляется.
<%@ Язык страницы="C#" %>
<%@ OutputCache Duration=60 VaryByParam="None" %>
<script runat="сервер">
недействительный Page_Load()
{
Метка1.Текст = ДатаВремя.Now.ToString();
}
общедоступная статическая строка GetTime (контекст HttpContext)
{
вернуть DateTime.Now.ToString();
}
</скрипт>
<html>
<head runat="server"></head>
<тело>
<form id="form1" runat="server">
<дел>
<р>
<asp:Label runat="server" ID="Label1" />
</p>
<р>
<asp:Замена runat="сервер"
ID="Замена1"
MethodName="GetTime" />
</p>
<р>
<asp:Button runat="server" ID="Button1" Text="Submit"/>
</p>
</div>
</форма>
</тело>
</html>
3. Класс замены
Используйте элемент управления «Замена», чтобы указать часть выходной кэшированной веб-страницы, которую вы хотите заменить элементом управления динамическим содержимым. Элемент управления «Замена» предоставляет упрощенное решение для кэширования частичных страниц для страниц, на которых должна быть кэширована большая часть содержимого. Вы можете кэшировать всю страницу, а затем использовать элемент управления «Подстановка», чтобы указать части страницы, освобожденные от кэширования. Области, которые необходимо кэшировать, выполняются только один раз, а затем считываются из кэша до тех пор, пока не истечет срок действия элемента кэша или он не будет очищен. Динамические регионы выполняются каждый раз, когда запрашивается страница. Эта модель кэширования упрощает код для страниц с преимущественно статическим содержимым, поскольку эти части не нужно инкапсулировать для кэширования в пользовательских веб-элементах управления. Например, эта модель кэширования полезна, если страница содержит статический контент (например, новостную статью) и элемент управления AdRotator, отображающий рекламу. Новостные статьи не изменяются, а это значит, что их можно кэшировать. Однако вы хотите показывать новое объявление каждый раз, когда пользователь запрашивает страницу. Элемент управления AdRotator напрямую поддерживает замену после кэширования, которая отображает новое объявление при обратной отправке страницы, независимо от того, кэширована ли страница.
Примечание. Элемент управления «Подстановка» можно поместить в пользовательский элемент управления, содержащийся на странице кэша. Однако вы не можете поместить элемент управления «Замена» в пользовательский элемент управления кэша вывода.
При выполнении элемента управления подстановкой вызывается метод, возвращающий строку. Строка, возвращаемая этим методом, представляет собой содержимое, которое будет отображаться в расположении элемента управления «Замена» на странице. Используйте свойство MethodName, чтобы указать имя метода обратного вызова, который будет вызываться при выполнении элемента управления подстановкой. Указанный метод обратного вызова должен быть статическим методом страницы или пользовательского элемента управления, содержащего элемент управления Substitution. Подпись метода обратного вызова должна совпадать с подписью делегата HttpResponseSubstitutionCallback, который принимает параметр HttpContext и возвращает строку.
Для управления кэшем вывода страницы вы можете использовать директиву @OutputCache, класс HttpCachePolicy или свойство Cache.
Другой способ использования элемента управления подстановкой — использование делегата HttpResponseSubstitutionCallback для реализации поведения замены кэша. Кроме того, поведение замены кэша может быть реализовано в элементах управления, которые напрямую поддерживают функцию замены кэша, таких как элемент управления AdRotator.
Пример
В следующем примере кода показано, как декларативно добавить элемент управления Substitution на веб-страницу кэша вывода. Когда страница загружается, пользователю отображаются текущая дата и время на вкладке. Эта область страницы кэшируется и обновляется каждые 60 секунд. При выполнении элемента управления Substitution вызывается метод GetCurrentDateTime. Строка, возвращаемая GetCurrentDateTime, будет отображена пользователю. Эта часть страницы не кэшируется и обновляется каждый раз при обновлении страницы.
<%@ выходного кэша продолжительности="60"varibyparam="none" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
" http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd ">
<script runat="server" Language="C#">
void Page_Load (отправитель объекта, System.EventArgs e)
{
// Отображение текущей даты и времени в метке.
// Кэширование вывода применяется к этому разделу страницы.
CachedDateLabel.Text = DateTime.Now.ToString();
}
// Элемент управления подстановкой вызывает этот метод для получения
// текущая дата и время Этот раздел страницы.
// освобожден от кэширования вывода.
общедоступная статическая строка GetCurrentDateTime (контекст HttpContext)
{
вернуть DateTime.Now.ToString();
}
</скрипт>
<html>
<head runat="сервер">
<title>Пример класса замены</title>
</голова>
<тело>
<form id="form1" runat="server">
<h3>Пример класса замены</h3>
<p>Этот раздел страницы не кэшируется:</p>
<asp:substitution id="Substitution1"
имя_метода="GetCurrentDateTime"
runat="Сервер">
</asp:замена>
<br />
<p>Этот раздел страницы кэшируется:</p>
<asp:label id="CachedDateLabel"
runat="Сервер">
</asp:label>
<br /><br />
<asp:button id="RefreshButton"
text="Обновить страницу"
runat="Сервер">
</asp:button>
</форма>
</тело>