Для этого можно использовать параметр VaryByCustom
.
В вашем пользовательском контроле у вас будет следующее:
<%@ OutputCache Duration="1000" VaryByParam="None" VaryByCustom="MyKey" %>
Тогда вы переопределите метод GetVaryByCustomString
в вашем Global.asax следующим образом:
public override string GetVaryByCustomString(HttpContext context, string arg)
{
if (arg == "MyKey")
{
object o = context.Current.Application["MyGuid"];
if (o == null)
{
o = Guid.NewGuid();
context.Current.Application["MyGuid"] = o;
}
return o.ToString();
}
return base.GetVaryByCustomString(context, arg);
}
Наконец, в MyPage.aspx
вы бы сделали это:
Application["MyGuid"] = Guid.NewGuid();
Как это работает?
Всякий раз, когда ваш элемент управления кэшируется, он связывается со строкой (строка, возвращаемая методом GetVaryByCustomString
, когда в него передается ключ VaryByCustom
элемента управления).
При каждом последующем использовании элемента управления снова вызывается GetVaryByCustomString
. Если возвращаемая строка соответствует кэшированной версии элемента управления, используется кэшированная версия.
В нашем случае «MyKey» передается в GetVaryByCustomString
и возвращает то, что хранится в Application["MyGuid"]
.
Всякий раз, когда вызывается MyPage.aspx
, он заменяет Application["MyGuid"]
на новое случайное значение.
Когда ваш элемент управления будет в следующий раз использован, метод GetVaryByCustomString
вернет новое значение, и поскольку кешированная версия элемента управления, связанного с этим значением, будет восстановлена. (Затем элемент управления будет кэширован и связан с новым значением, чтобы сохранить его до следующего вызова MyPage.aspx
и т. Д.)
Здесь есть обзор здесь .