Ответ 1
Чтобы ответить на ваш первый вопрос Q, позвольте мне сначала сказать вам, что ваш вопрос сам имеет ответ;). "Общий"... да, что ключевое слово:) Чтобы иметь один экземпляр в кеше для пользовательского элемента управления на всех страницах, установите Shared = 'true' в директиве @OutputCache. Это должно быть установлено на уровне пользовательского управления, то есть на странице ascx.
Чтобы кэшировать пользовательский элемент управления на основе свойств пользовательского управления, вы должны указать полное имя свойств в разделе varyByControls атрибута PartialCachingAttribute. Несколько свойств, если они должны быть разделены полуколонами.
<%@ Control Language="C#" AutoEventWireup="true"
CodeFile="WebUserControl.ascx.cs"
Inherits="UC_WebUserControl" %>
<%@ OutputCache Duration="60"
VaryByControl="UC_WebUserControl.param1;UC_WebUserControl.param2"
VaryByParam="none" Shared="true" %>
или вы также можете включить атрибут PartialCache для пользовательского элемента управления:
[PartialCaching(60, null, "UC_WebUserControl.param1;UC_WebUserControl.param2", null, true)]
public partial class UC_WebUserControl : System.Web.UI.UserControl
{
public string param1 { get; set; }
public string param2 { get; set; }
}
ИЛИ другим способом кэширования элемента управления для комбинации обоих значений будет:
[PartialCaching(60, null, "UC_WebUserControl.BothParams", null, true)]
public partial class UC_WebUserControl : System.Web.UI.UserControl
{
public string param1 { get; set; }
public string param2 { get; set; }
public string BothParams
{
get { return String.Concat(param1, param2); }
}
}
Последний параметр (true) указывает общий. Длительность указана в 60. См. Ссылку Как: Кэш нескольких версий пользовательского элемента управления на основе параметров
Чтобы ответить на второй Q, чтобы сделать продолжительность кэша для пользовательской переменной управления во время выполнения, вы можете сделать это двумя способами:
-
Назначьте его в коде управления пользователя позади:
[PartialCaching(60, null, "UC_WebUserControl.BothParams", null, true)] public partial class WebUserControl1 : System.Web.UI.UserControl { ... protected void Page_Load(object sender, EventArgs e) { this.CachePolicy.Duration = new TimeSpan(0, 0, 60); } }
-
Вы можете назначить его в коде позади страницы, на которую ссылается элемент управления пользователя, с помощью идентификатора пользовательского элемента управления.
например. Если пользовательский контроль над aspx:
<mycontrols:control1 ID="ucControl1" runat="server" param1="15" param2="20" />
то в коде позади aspx вы должны написать:
this.ucControl1.CachePolicy.Duration = new TimeSpan(0, 0, 60);
FYI, если кэшируются как пользовательский элемент управления, так и страница: если продолжительность кэша вывода страницы меньше, чем у пользовательского элемента управления, пользовательский элемент управления будет кэшироваться до истечения его продолжительности, даже после того, как остальная часть страницы будет регенерированный для запроса. Например, если кеширование вывода страницы установлено на 50 секунд, а кэширование выходных данных управления пользователя установлено на 100 секунд, пользовательское управление истекает один раз на каждые два раза, оставшееся до конца страницы.