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:
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);
}
}
è 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.
Response.Cache è per la memorizzazione nella cache a livello di pagina. Sono interessato al caching a livello di controllo utilizzando l'attributo PartialCaching. – frankadelic
Hai ottenuto il tuo punto ... Ho modificato la risposta di conseguenza :) –
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