Para responder a su primera pregunta, déjeme decirle primero que su pregunta en sí tiene la respuesta;). 'Compartido' ... sí, es la palabra clave :) Para tener una sola instancia en la memoria caché para el control del usuario en todas las páginas, establezca Shared = 'true' en la directiva @OutputCache. Esto debe establecerse en el nivel de control del usuario, es decir, en la página ascx.
Para almacenar en caché el control de usuario según las propiedades de control del usuario, debe especificar el nombre completo de las propiedades en la sección varyByControls de PartialCachingAttribute. Múltiples propiedades, si las hay, deberían estar separadas por punto y coma.
<%@ 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" %>
o también puede incluir el atributo PartialCache para el control de usuario:
[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; }
}
u otra manera de almacenar en caché el control de la combinación de ambos valores serían:
[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); }
}
}
El último parámetro (verdadero) especifica compartido. La duración se especifica en 60. Consulte el enlace How to: Cache Multiple Versions of a User Control Based on Parameters
Para responder a su segunda Q, para hacer que la duración de la caché para la variable de control de usuario en tiempo de ejecución, puede hacerlo de dos maneras:
asignarlo en el código detrás de control de usuario:
[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);
}
}
puede asignarla en el código detrás de la página donde se hace referencia a control de usuario utilizando el ID del control de usuario.
e.g. Si el control de usuario en el aspx es:
<mycontrols:control1 ID="ucControl1" runat="server" param1="15" param2="20" />
a continuación en el código detrás de aspx, debe escribir:
this.ucControl1.CachePolicy.Duration = new TimeSpan(0, 0, 60);
FYI, si tanto el control de usuario y la página se almacenan en caché: si la página la duración de la memoria caché de salida es menor que la de un control de usuario, el control de usuario se almacenará en caché hasta que su duración expire, incluso después de que el resto de la página se haya regenerado para una solicitud. Por ejemplo, si el almacenamiento en caché de salida de página está establecido en 50 segundos y el almacenamiento en caché de salida del control del usuario está establecido en 100 segundos, el control de usuario caduca una vez cada dos veces que expira el resto de la página.
Response.Cache es para el almacenamiento en caché a nivel de página. Estoy interesado en el almacenamiento en caché de nivel de control utilizando el atributo PartialCaching. – frankadelic
Entendí mi punto ... He editado la respuesta en consecuencia :) –
Además, tu ejemplo [PartialCaching (60, "param1", null, null, true)] ... esto variará en función de un "param1" QueryString o Parámetro POST Eso no es lo que quiero. "Me gustaría que los controles en caché varíen en función de las propiedades establecidas en la instancia de control". – frankadelic