2009-05-19 10 views
11

Estoy usando el atributo PartialCaching en la clase base de un control de usuario.Varía según propiedades de control utilizando PartialCaching en ASP.NET

Me gustaría que los controles en caché varíen en función de las propiedades establecidas en la instancia de control.

Por ejemplo:

<mycontrols:control1 runat="server" param1="10" param2="20" /> 

... salida sería en caché por separado a partir de un ejemplo de control con diferentes propiedades:

<mycontrols:control1 runat="server" param1="15" param2="20" /> 

... y este control sería en caché por separado, así:

<mycontrols:control1 runat="server" param1="10" param2="25" /> 

Sin embargo, si dos instancias de control en dos páginas separadas tenían propiedades idénticas param1 y param2, me gustaría que guardaran en caché como un objeto (para que el control en caché se comparta).

¿Se puede lograr el caso de uso anterior con el atributo PartialCaching? ¿Qué configuración usaría? varyByControl?

Además, ¿es posible hacer la variable de duración de la memoria caché en tiempo de ejecución?

Gracias.

Respuesta

22

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:

  1. 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); 
        }  
    }
  2. 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.

+0

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

+0

Entendí mi punto ... He editado la respuesta en consecuencia :) –

+0

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

1

Estoy publicando una nueva respuesta a esta pregunta muy antigua porque la respuesta aceptada es lamentablemente inexacta. Esta respuesta correcta es:

  • No existe una forma integrada de variar según el valor de la propiedad de control. VaryByControl solo funciona para controles.
  • Cuando se publica una versión en caché, su campo de control será nulo. No puede cambiar la duración de la memoria caché en el código: obtendrá una NullReferenceException.
  • Existe un error que varía la memoria caché por ID de control y NamingContainer ID (s) si VaryByControl se establece en cualquier valor. Es por eso que parece funcionar a veces. El error está aquí: http://referencesource.microsoft.com/#System.Web/xsp/system/Web/UI/PartialCachingControl.cs#530

He escrito sobre esto recientemente aquí: http://tabeokatech.blogspot.be/2014/09/outputcache-on-user-controls.html.

Una forma en que podría hacer este trabajo es llamar al método constructor para la PartialCachingControl a sí mismo en código subyacente, e incrustar el valor de la propiedad que desea variar en el parámetro GUID:

// PhControls is an asp:PlaceHolder 
    protected void Page_Init(object sender, EventArgs e) 
    { 
     for (int i = 0; i < 3; i++) 
     { 
      System.Web.UI.StaticPartialCachingControl.BuildCachedControl(PhControls, String.Format("Test{0}", i), String.Format("1234567{0}", i), 180, null, null, null, null, new System.Web.UI.BuildMethod(GetBuilderDelegate(i)), null); 
     } 
    } 

    public Func<Control> GetBuilderDelegate(int number) 
    { 
     return delegate() 
     { 
      var control = (UserControls.Test)LoadControl("~/UserControls/Test.ascx"); 
      control.Number = number; 
      return control; 
     }; 
    } 

que toma cuidadosamente cuidado de variar la duración del almacenamiento en caché en código subyacente también. Sin embargo, asegúrese de quitar la directiva OutputCache del marcado en el archivo ascx cuando haga esto. De lo contrario, LoadControl obtiene otro ParcialCachingControl y falla el lanzamiento.

Cuestiones relacionadas