Domanda

Come posso memorizzare nella cache un'intera pagina tranne un po 'in alto che dice qualcosa sulla falsariga di "Welcome back, Matt! | Log Out" se l'utente è connesso e così via?

Sto usando ASP.NET MVC 2.

È stato utile?

Soluzione

Quello che stai cercando di ottenere si chiama memorizzazione nella cache della ciambella o sostituzione della cache.A partire da ASP.NET MVC 2 non è presente alcun helper integrato per supportare questo scenario.Per quanto ne so, era una funzionalità pianificata in MVC v.1 ma è stata abbandonata da qualche parte nel modo in cui è stato rilasciato.Per maggiori informazioni controlla questo link http://haacked.com/archive/2008/11/05/donut-caching-in-asp.net-mvc.aspx, Donut Caching funziona correttamente con ASP.NET MVC?. L'opzione VaryByParam menzionata da Oleg qui non è una buona idea nel tuo caso.Se hai VaryByParam verrà messa nella cache una versione diversa della pagina per ogni diverso valore del parametro (nel tuo caso per ogni nome utente). Personalmente penserei di memorizzare nella cache i dati, non l'intero output della pagina.

Altri suggerimenti

Probabilmente aiuta

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

o con qualche altro valore per il 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 hai la pagina iniziale che non dipende dall'utente, è possibile sostituire la pagina iniziale con una pagina di benvenuto molto statica con il campo vuoto (div nascosto) invece di "Bentornato, Matt! | Disconnetti".Successivamente è possibile avviare una richiesta ajax per il riempimento del nome utente sul lato client.Questo tipo di pagina di benvenuto può essere memorizzato nella cache molto bene.

Qui hai una soluzione alternativa:

*Aggiungi l'attributo OuptuCache al Controller che gestisce l'intera vista come di consueto:

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

*Per la parte che non vuoi memorizzare nella cache, caricala usando jquery + una richiesta ajax (con il proprio controller 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à recuperata dalla cache di output e, una volta caricata, verrà eseguita una richiesta per ottenere le informazioni di accesso.Si spera che sia una richiesta molto rapida e che l'utente non si accorga del ritardo.

Ottieni questo tramite nuget: http://mvcdonutcaching.codeplex.com/

Aggiungi un'azione per LogOnPArtial, così puoi cambiarla da Html.Partial a Html.Action in _Layout.cshtml

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

Il true è un parametro di esclusione che dice di escluderlo dalla memorizzazione nella 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 tua pagina, ad esempio About.cshtml che desideri memorizzare nella cache, applica l'attributo DonutOutputCache.Ciò consente al nuovo framework di ispezionare la pagina mentre la memorizza nella cache e aggiungere flag in cui hai escluso le azioni.

La cosa bella è che _LogOnPartial non è memorizzato nella cache e si aggiornerà per utenti diversi mentre il resto della pagina è memorizzato nella cache e l'azione About() non verrà eseguita.Puoi anche configurare la memorizzazione nella cache sull'azione _LogOnPartial che hai creato usando l'attributo DonutOutputCache, ma un intervallo più frequente o meno frequente, o variare di qualche altro parametro.Ciò consente di comporre pagine di parziali e la logica di aggiornamento della cache è configurata in modo indipendente per ogni parziale.

IMO questo strumento è esattamente come immaginavo che avrebbe dovuto essere implementato la memorizzazione nella cache in MVC.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top