2010-07-26 10 views
9

Come è possibile memorizzare nella cache un'intera pagina tranne un bit nella parte superiore che indica qualcosa lungo le linee di "Welcome back, Matt! | Log Out" se l'utente è connesso e così via?ASP.NET MVC cache di output con frammento dinamico

che sto utilizzando ASP.NET MVC 2.

+0

Questo a volte viene chiamato "caching della ciambella" e non è supportato in asp.net mvc 2 http://stackoverflow.com/questions/2806663/donut-caching-asp-net-mvc2 –

+0

Perché? o_O Non ci sono altre soluzioni praticabili? –

+1

Non ho visto un'implementazione della cache ciambella. È sempre possibile memorizzare nella cache i dati nel controller, invece di memorizzare nella cache l'output html. –

risposta

6

Quello che stai cercando di ottenere è chiamato caching-ciambella o sostituzione della cache. A partire da ASP.NET MVC 2 non esiste un helper integrato per supportare questo scenario. Per quanto ne so, era una funzionalità pianificata in MVC v.1, ma è stata rilasciata da qualche parte nel modo in cui è stata rilasciata. Per maggiori informazioni controlla questo link http://haacked.com/archive/2008/11/05/donut-caching-in-asp.net-mvc.aspx, Is Donut Caching working properly with ASP.NET MVC?. L'opzione VaryByParam menzionata da Oleg qui non è una buona idea nel tuo caso. Se hai VaryByParam, una versione diversa della pagina verrà inserita nella cache per ogni diverso valore del parametro (nel tuo caso per ogni nome utente). Personalmente penserei al caching dei dati, non all'intero output della pagina.

3

aiuta Probabilmente

<%@ OutputCache Duration="15" VaryByParam="*" %> 

o con qualche altro valore per VaryByParam. Vedi http://msdn.microsoft.com/en-us/library/hdxfb6cy.aspx, http://blog.maartenballiauw.be/post/2008/06/Creating-an-ASPNET-MVC-OutputCache-ActionFilterAttribute.aspx e http://blogs.microsoft.co.il/blogs/gilf/archive/2010/07/18/asp-net-output-cache-provider.aspx.

Inoltre, se la pagina iniziale non è dipesa dall'utente, è possibile sostituire la pagina iniziale con una pagina di benvenuto molto statica con il campo vuoto (div nascosto) invece di "Bentornato, Matt! | Log Su". Dopo di ciò, una richiesta di ajax per il riempimento del nome utente può essere avviata dal lato client. Questo tipo di pagina di benvenuto può essere memorizzato nella cache.

+0

Nel caso di Matt ciò significa che una versione separata della pagina verrà inserita nella cache per ogni valore del parametro (ogni nome utente nel suo caso). –

+1

Un buon punto, anche se il recupero del nome utente tramite ajax è un'idea interessante. Potrei anche provare a recuperare il nome utente da un cookie, per evitare di fare una richiesta extra al server. –

+1

Ho pensato di evitare la direttiva di pagina 'OutputCache' nell'applicazione MVC e utilizzare invece i filtri di azione. : S –

0

Ecco una soluzione di soluzione:

* Aggiungere l'attributo OuptutCache per il controller che gestisce tutta la visione come di solito:

[OutputCache(Duration = 3600, VaryByParam = "*")] 
public ActionResult Index(FormCollection formCollection) 
{ 
    //Controller code 
} 

* Per la parte che non si vuole fare caching, caricarlo utilizzando jQuery + una richiesta AJAX (con il suo controllore e senza l'attributo OutputCache):

<div id="loginContainer"></div> 

$(document).ready(function() { 

    $.post('controller/action', postdata, function(data) { 

    if (data.success == true) { 

     //Populate the container with the obtained data 
    } 
    }); 

}); 

la vista verrà recuperato dalla cache di output e, una volta caricato, verrà eseguita una richiesta per ottenere le informazioni di accesso. Si spera che sarà una richiesta molto veloce e l'utente non noterà il ritardo.

+0

E cosa succede quando JavaScript è disabilitato sul client? –

+0

@rock non funzionerà. – Rangoric

0

Ottenere questo tramite NuGet: http://mvcdonutcaching.codeplex.com/

aggiungere un'azione per LogOnPArtial, in modo da poter cambiare da Html.Partial al Html.Action nel _Layout.cshtml

@Html.Action("_LogOnPartial","Account",true) 

Il true è un escludi parametro che dice, escludilo dalla cache. L'azione verrà chiamata anche se la pagina in cui si trova è memorizzata nella cache. Questo è il "buco" nella ciambella che non è memorizzato nella cache.

Nella pagina, come About.cshtml che si desidera memorizzare nella cache, applicare l'attributo DonutOutputCache. Ciò consente al nuovo framework di ispezionare la pagina mentre la memorizza nella cache e aggiungere flag dove hai escluso le azioni.

La cosa bella è _LogOnPartial non viene memorizzato nella cache e verrà aggiornato per utenti diversi mentre il resto della pagina viene memorizzato nella cache e l'azione About() non verrà eseguita. È anche possibile configurare la memorizzazione nella cache sull'azione _LogOnPartial creata utilizzando l'attributo DonutOutputCache, ma un intervallo più frequente o meno frequente o variare in base ad altri parametri. Ciò consente di comporre pagine di partial e la logica di aggiornamento della cache è configurata in modo indipendente per ciascun partial.

IMO questo strumento è esattamente come immaginavo che il caching in MVC avrebbe dovuto essere implementato.

Problemi correlati