2010-11-04 22 views
9

Attualmente sto sviluppando un sito Web usando asp.net mvc 2 in C#. Non ho mai utilizzato la funzione di memorizzazione nella cache in MVC e vorrei applicarlo alla pagina del profilo utente. Il contenuto di questa pagina cambia raramente e l'unica parte che deve essere in tempo reale è l'elenco dei post recenti dell'utente. (Uso linq-to-sql per caricare i dati dal database)Asp.net MVC 2 caching

Ho bisogno di alcuni suggerimenti su quale tecnica di caching dovrei usare e come implementarla?

Aggiornamento: La soluzione di Xandy sotto quasi funziona, tranne che non posso passare in dati. Come potrei riscrivere questo usando il? Html.RenderPartial ("UserPosts", ViewData ["UserPosts"])

+0

Vedere anche http://stackoverflow.com/questions/4082826/when-and-how-to-go-about-performing-caching-in-asp-net-mvc/4091232#4091232 –

+0

qualcuno conosce la risposta? al mio aggiornamento? – Rana

+0

è necessario utilizzare il quarto sovraccarico per RenderPartial (http://msdn.microsoft.com/en-us/library/dd470561.aspx) provare: 'Html.RenderPartial (" UserPosts.ascx ", Model.UserPosts, nuovo ViewDataDictionary {Model = Model.UserPosts} '. – RPM1984

risposta

1

ASP.Net ha un tutorial on output caching for MVC.

Partial (aka Donut) Caching che potrebbe funzionare per MVC2.

+0

Sì, l'ho visto anche io. Ma come posso memorizzare nella cache la pagina mentre ne faccio parte non memorizzata nella cache? – Rana

+0

nella pagina successiva di quella relativa al caching parziale. http://www.asp.net/mvc/tutorials/adding-dynamic-content-to-a-cached-page-cs – xandy

+0

Questo è ancora il metodo preferito in MVC 2? – Rana

5

Come altre risposte hanno dichiarato, ciambella caching "sorta di" lavori in MVC.

io non lo consiglio - invece io ti offro un alterantive:

si ha una vista per il profilo di utenti, chiamiamolo "UserProfile.aspx".

Ora su questa vista, hai un sacco di HTML, tra cui una sezione per "post recenti".

Ora, presumo che si tratti di qualcosa come gli ultimi 10 post per l'utente.

quello che vorrei fare è mettere questo HTML/sezione in una vista parziale, e servire attraverso un metodo di azione separata, alias un PartialViewResult:

public class UserProfileController 
{ 
    [HttpGet] 
    [OutputCache (Duration=60)] 
    public ActionResult Index() // core user details 
    { 
     var userProfileModel = somewhere.GetSomething(); 
     return View(userProfileModel); 
    } 

    [HttpGet] 
    public PartialViewResult DisplayRecentPosts(User user) 
    { 
     var recentPosts = somewhere.GetRecentPosts(user); 
     return PartialViewResult(recentPosts); 
    } 
} 

Render la Vista parziale utilizzando jQuery:

<script type="text/javascript"> 
    $(function() { 
    $.get(
     "/User/DisplayRecentPosts", 
     user, // get from the Model binding 
     function (data) { $("#target").html(data) } // target div for partial 
    ); 
    }); 
</script> 

In questo modo, è possibile eseguire il maxout di OutputCache per i dettagli principali (Index()), ma i post recenti non vengono memorizzati nella cache. (oppure puoi avere un periodo di cache molto piccolo).

Il metodo jQuery di rendering parziale è diverso da RenderPartial, in questo modo si sta servendo l'HTML direttamente dal controller, in modo da poter controllare la cache di output di conseguenza.

Il risultato finale è molto simile alla cache ciambella (parti della pagina memorizzate nella cache, altre no).

+1

Che dire dei client senza javascript? – xandy

+2

Era un requisito dichiarato dall'OP? – RPM1984

Problemi correlati