Чтобы ответить на ваш первый вопрос, позвольте мне сначала сказать вам, что на ваш вопрос есть ответ;). «Shared» ... да, это ключевое слово :) Чтобы иметь один экземпляр в кэше для пользовательского элемента управления на всех страницах, установите Shared = 'true' в директиве @OutputCache. Это должно быть установлено на уровне управления пользователем, то есть на странице ascx.
Чтобы кэшировать пользовательский элемент управления на основе свойств пользовательского элемента управления, необходимо указать полное имя свойства в разделе varByControls 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. См. Ссылку Как: кэшировать несколько версий пользовательского элемента управления на основе параметров
Чтобы ответить на ваш второй вопрос, чтобы установить длительность кэша для пользовательской управляющей переменной во время выполнения, вы можете сделать это двумя способами:
Назначьте его в пользовательском коде управления:
[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);
К вашему сведению, если и пользовательский элемент управления, и страница кэшированы: если длительность кэша вывода страницы меньше, чем у пользовательского элемента управления, пользовательский элемент управления будет кэшироваться до истечения его продолжительности, даже после того, как остальная часть страницы будет регенерируется по запросу. Например, если для кэширования вывода страницы установлено значение 50 секунд, а для кэширования вывода пользовательского элемента управления установлено значение 100 секунд, срок действия пользовательского элемента управления истекает один раз каждые два раза, когда истекает срок действия остальной части страницы.