2010-11-04 15 views
9

Ich entwickle derzeit eine Website mit asp.net mvc 2 in C#. Ich habe nie die Caching-Funktion in MVC verwendet und möchte sie auf die Benutzerprofilseite anwenden. Der Inhalt dieser Seite ändert sich selten und der einzige Teil, der in Echtzeit sein muss, ist die Liste der letzten Posts durch den Benutzer. (Ich benutze linq-to-sql, um Daten von der Datenbank zu laden)Asp.net MVC 2 Caching

Ich brauche einige Vorschläge, welche Caching-Technik ich verwenden sollte und wie man sie implementiert?

Update: Xandy Lösung unten funktioniert fast, außer ich kann nicht Daten übergeben. Wie würde ich das mit dem neu schreiben? Html.RenderPartial ("UserPosts", ViewData ["UserPosts"])

+0

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

+0

jemand weiß die Antwort? zu meinem Update? – Rana

+0

Sie müssen die vierte Überladung für RenderPartial verwenden (http://msdn.microsoft.com/en-us/library/dd470561.aspx) versuchen: 'Html.RenderPartial (" UserPosts.ascx ", Model.UserPosts, neue ViewDataDictionary {Model = Model.UserPosts} '. – RPM1984

Antwort

1

ASP.Net hat eine tutorial on output caching for MVC.

Partial (aka Donut) Caching, die für MVC2 funktionieren würde.

+0

Ja, das habe ich auch gesehen, aber wie kann ich die Seite zwischenspeichern, während ich einen Teil davon nicht zwischengespeichert habe? – Rana

+0

Die nächste Seite davon spricht über partielles Caching. http://www.asp.net/mvc/tutorials/adding-dynamic-content-to-a-cached-page-cs – xandy

+0

Ist dies immer noch die bevorzugte Methode in MVC 2? – Rana

5

Wie andere Antworten verwendet haben angegeben, Donut-Caching „Art“ Werke in MVC.

Ich würde es nicht empfehlen - stattdessen werde ich ein alterantive bieten:

Sie haben eine Ansicht für die Benutzer Profil, nennen wir es „UserProfile.aspx“.

Jetzt auf dieser Ansicht haben Sie eine Reihe von HTML, einschließlich eines Abschnitts für "aktuelle Beiträge".

Nun nehme ich an, das ist so etwas wie die letzten 10 Beiträge für den Benutzer.

Was ich tun würde, gesetzt wird HTML/Abschnitt in eine Teilansicht, und servieren es über eine separate Aktion-Methode, auch bekannt als ein 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); 
    } 
} 

die Teilansicht mit jQuery Render aus:

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

Auf diese Weise können Sie den OutputCache für die Kerndetails (Index()) maximieren, aber die letzten Beiträge werden nicht zwischengespeichert. (oder Sie können eine sehr kleine Cache-Periode haben).

Die jQuery-Methode zum Rendern der partiellen unterscheidet sich von RenderPartial, wie Sie den HTML-Code direkt aus dem Controller dienen, so können Sie die Ausgabe zwischenspeichern entsprechend.

Das Endergebnis ist sehr ähnlich wie Donut-Caching (Teile der Seite zwischengespeichert, andere nicht).

+1

Also was ist mit Clients ohne Javascript? – xandy

+2

War das eine Anforderung des OP? – RPM1984