2009-02-20 7 views
6

Ho creato un controllo utente nella mia applicazione "header.ascx", sto passando un attributo SelectedMenu a questo controllo su cui il controllo seleziona il valore selezionato del menu. Supponiamo, ho passato il valore "casa" o "ricerca", quindi selezionerà (evidenziarlo) il menu di ricerca.Memorizzazione nella cache di un controllo utente in ASP.NET?

Voglio memorizzare nella cache questo controllo, quando il valore dell'attributoMenu selezionato cambia solo la cache verrà aggiornata altrimenti dovrebbe prelevare il controllo dalla cache ??

È possibile memorizzare nella cache un controllo utente in asp.net ?? Sto usando ASP.NET 2.0 (C#)

risposta

5

Certo che puoi! Si chiama "Framment Caching". Ecco un collegamento allo Quickstarts page e allo MS Knowledge base. Inoltre, Google.

+0

lol +1 per google! Potresti aver aggiunto questo link a una buona domanda su stackoverflow http://stackoverflow.com/questions/568837/caching-a-user-control-in-asp-net – Matt

6

Il caching del controllo utente in ASP.NET si chiama fragment caching. E 'fatto con l'aggiunta di una direttiva OutputCache alla parte superiore della pagina:

Non è possibile variare la cache impostando la proprietà sul controllo perché il controllo non è effettivamente creato se è trovata nella cache. Se si tenta di accedere al controllo nel codice dietro di esso è memorizzato nella cache, sarà nullo.

La condizione che determina se il controllo deve essere memorizzato nella cache o non qualcosa che è possibile determinare osservando la richiesta corrente? In tal caso, è possibile utilizzare l'attributo varybycustom (http://msdn.microsoft.com/en-us/library/system.web.ui.partialcachingattribute.varybycustom.aspx) della direttiva cache di output. È possibile inserire qualsiasi stringa desiderata come parametro e, quando viene valutata la memorizzazione nella cache, verrà chiamato il numero GetVaryByCustomString() method from Global.asxa e sarà possibile impostare la logica per stabilire se il controllo deve essere memorizzato nella cache o non essere presente.

+0

@Helephant, In questo caso ho il sospetto che probabilmente potrebbero usa VaryByControl. – LukeH

+0

Sì, sarebbe VaryByControl. – Cerebrus

1

non penso che sia una buona idea quella di memorizzare nella cache il controllo stesso:

  • Quando il controllo viene creata la prima volta, ha riferimenti alla sua pagina padre tra gli altri.
  • Quando si recupera il controllo dalla cache, tali riferimenti non esistono più.

Un approccio migliore, penso, è quello di memorizzare nella cache i dati utilizzati dal controllo. ASP.NET crea così tanti controlli durante il ciclo di vita della pagina, che il caching di questo controllo non migliora nulla.

Quindi una domanda stupida alla fine: questo controllo è un collo di bottiglia? Hai davvero bisogno del cache?

+1

cahcing usercontrols è in qualche modo una buona idea, perché risparmia il tempo di rendering '(ottimizzazione delle prestazioni)' di controllo. ovviamente quando viene memorizzato nella cache una volta ottenuto un riferimento null nella pagina a meno che e fino a quando la cache non è scaduta. –

+0

@Zain, penso che ci stiamo riferendo a cose diverse. Il caching del controllo stesso non salverà il tempo di rendering come suggerito, ma lo farà l'output in cache. –

0

In sintesi

utilizzando VaryByCustom, significa

1- ricostruire il controllo.
2- Avere più versioni del controllo nella cache. che verrà utilizzato quando le condizioni personalizzate corrispondono a.

Questo è solo un bene se il controllo richiede molto tempo per la compilazione e abbiamo un numero finito di versioni memorizzate nella cache per non sprecare memoria e l'applicazione dovrà accedere alle proprietà di controllo (mentre è memorizzata nella cache "o null").

ma non sarà positivo se le condizioni personalizzate dipendono dalle proprietà del controllo stesso. Non riesco ad accedervi, è nullo.

per esempio voglio scrivere qualcosa di simile se (il valore predefinito valore selezionato nella lista dei paesi non è USA) poi ricostruire e Cache (dargli una stringa differente)

Altrimenti non fare

mentre altri oggetti stanno provando ad accedere alla lista dei contatti, controllerà la nullità e imposterà l'elenco a discesa dei paesi in USA.

I dati potrebbero fare il lavoro. è l'unico modo.

chi è d'accordo?

Grazie per il tuo tempo