2009-05-19 7 views
11

Sto utilizzando l'attributo PartialCaching sulla classe base di un controllo utente.Variabile in base al controllo delle proprietà utilizzando PartialCaching in ASP.NET

Vorrei che i controlli memorizzati nella cache cambino in base alle proprietà impostate sull'istanza di controllo.

Ad esempio:

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

... uscita sarebbe nella cache separatamente da un'istanza di controllo con differenti proprietà:

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

... e questo controllo sarebbe nella cache anche separatamente:

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

Tuttavia, se due istanze di controllo su due pagine separate avevano identico proprietà param1 e param2, mi piacerebbe che fossero memorizzati nella cache come un oggetto (in modo che il controllo memorizzato nella cache fosse condiviso).

È possibile raggiungere il caso di utilizzo sopra descritto con l'attributo PartialCaching? Quali impostazioni dovrei usare? VaryByControl?

Inoltre, è possibile impostare la variabile di durata della cache in fase di esecuzione?

Grazie.

risposta

22

Per rispondere alla prima Q, permettetemi prima di dirvi che la vostra stessa domanda ha la risposta;). 'Condiviso' ... sì, questa è la parola chiave :) Per avere una singola istanza nella cache per il controllo utente su tutte le pagine, imposta Condiviso = 'vero' nella direttiva @OutputCache. Questo dovrebbe essere impostato a livello di controllo dell'utente, ad esempio nella pagina ascx.

Per memorizzare il controllo utente in base alle proprietà del controllo utente, è necessario specificare il nome completo delle proprietà nella sezione varyByControls di PartialCachingAttribute. Più proprietà se nessuna dovrebbe essere separata da punti e virgola.

<%@ 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 si può anche includere l'attributo PartialCache per il controllo utente:

[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; } 

} 

O altro modo per memorizzare nella cache il controllo sulla combinazione di entrambi i valori sarebbe:

[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); } 
    } 

} 

L'ultimo parametro (true) specifica condiviso. Durata è specificato da 60. Fare riferimento al link How to: Cache Multiple Versions of a User Control Based on Parameters

Per rispondere alla tua seconda Q, per allineare la durata della cache per la variabile di controllo utente in fase di esecuzione, è possibile farlo in due modi:

  1. assegnare nel codice di controllo utente dietro:

    [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. è possibile assegnarlo nel codice dietro della pagina in cui il controllo utente viene fatto riferimento utilizzando l'ID del controllo utente.

ad es. Se il controllo utente sul aspx è:

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

poi nel codice dietro di aspx, si dovrebbe scrivere:

this.ucControl1.CachePolicy.Duration = new TimeSpan(0, 0, 60); 

Cordiali saluti, se sia il controllo utente e la pagina vengono memorizzati nella cache: se la pagina la durata della cache di output è inferiore a quella di un controllo utente, il controllo utente verrà memorizzato nella cache fino alla scadenza della sua durata, anche dopo che il resto della pagina viene rigenerato per una richiesta. Ad esempio, se il caching dell'output delle pagine è impostato su 50 secondi e il caching dell'output del controllo utente è impostato su 100 secondi, il controllo utente scade una volta ogni due volte per il resto della pagina.

+0

Response.Cache è per la memorizzazione nella cache a livello di pagina. Sono interessato al caching a livello di controllo utilizzando l'attributo PartialCaching. – frankadelic

+0

Hai ottenuto il tuo punto ... Ho modificato la risposta di conseguenza :) –

+0

Inoltre, il tuo esempio [PartialCaching (60, "param1", null, null, true)] ... questo varierà in base a un parametro "param1" QueryString o Parametro POST. Non è quello che voglio. "Vorrei che i controlli memorizzati nella cache cambiassero in base alle proprietà impostate sull'istanza di controllo." – frankadelic

1

Sto postando una nuova risposta a questa domanda molto vecchia perché la risposta accettata è tristemente inaccurata. Questa risposta corretta è:

  • Non esiste un modo integrato per variare in base al valore della proprietà di controllo. VaryByControl funziona solo per i controlli.
  • Quando viene pubblicata una versione memorizzata nella cache, il campo di controllo sarà nullo. Non è possibile modificare la durata della cache nel codice: si otterrà una NullReferenceException.
  • C'è un bug che varia la cache per ID di controllo e ID di NamingContainer se VaryByControl è impostato su qualsiasi valore. Questo è il motivo per cui sembra funzionare a volte. Il bug è proprio qui: http://referencesource.microsoft.com/#System.Web/xsp/system/Web/UI/PartialCachingControl.cs#530

Ho parlato di questo recentemente proprio qui: http://tabeokatech.blogspot.be/2014/09/outputcache-on-user-controls.html.

Un modo si potrebbe fare questo lavoro è chiamare il metodo costruttore per la PartialCachingControl se stessi in code-behind, e incorporare il valore della proprietà che si desidera variare in base nel parametro 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; 
     }; 
    } 

che prende ordinatamente cura anche della diversa durata del caching in code-behind. Assicurati di rimuovere la direttiva OutputCache dal markup in ascx anche se lo fai. In caso contrario, LoadControl ottiene un altro PartialCachingControl e il cast non riesce.

Problemi correlati