2010-12-27 7 views
4

Ich bin mit Razor-Ansicht-Engine in ASP.Net MVC 3 RC 2. Dies ist Teil meiner Ansicht city.cshtmlNested Teil Ausgabe-Caching in ASP.NET MVC 3

(stark vereinfacht Code für die der Einfachheit halber in Beispiel)

<!-- in city.cshtml --> 
<div class="list"> 
@foreach(var product in SQL.GetProducts(Model.City)) 
{ 
    <div class="product"> 
    <div>@product.Name</div> 
    <div class="category"> 
    @foreach(var category in SQL.GetCategories(product.ID)) 
    { 
     <a href="@category.Url">@category.Name</a> » 
    } 
    </div> 
    </div> 
} 
</div> 

ich möchte diesen Teil meiner Ausgabe cachen Attribut Output, so habe ich eine Aktion ProductList mit OutputCache Attribut

aktiviert 0

und ich geschaffen, um die Ansicht in ProductList.cshtml wie unten

<!-- in ProductList.cshtml --> 
@foreach(var product in Model.Products) 
{ 
    <div class="product"> 
    <div>@product.Name</div> 
    <div class="category"> 
    @foreach(var category in SQL.GetCategories(product.ID)) 
    { 
     <a href="@category.Url">@category.Name</a> » 
    } 
    </div> 
    </div> 
} 

aber ich muß noch die Kategorie Pfad Ausgabe auf jedes Produkt cachen. so habe ich eine Aktion CategoryPath mit OutputCache Attribut

aktiviert
<!-- in ProductList.cshtml --> 
@foreach(var product in Model.Products){ 
    <div class="product"> 
    <div>@product.Name</div> 
    <div class="category"> 
     @Html.Action("CategoryPath", new { ProductID = product.ID }) 
    </div> 
    </div> 
} 

Aber anscheinend ist dies nicht erlaubt. Ich habe diesen Fehler:

Ich glaube, sie haben einen guten Grund, warum sie dies verbieten müssen. Ich möchte wirklich diese Art von geschachtelte Ausgabe Caching.

Eine Idee für eine Problemumgehung?

+0

[Überprüfen Sie diesen Link] (http://blog.stevensanderson.com/2008/10/15/partial-output-caching-in-aspnet-mvc/) – Korayem

Antwort

1

In der SQL.GetCategories-Methode können Sie alle Kategorien abrufen und zwischenspeichern, wenn sie nicht bereits im Cache vorhanden sind. Und Filter Kategorien nach Produkt-ID mit LINQ TO OBJECTS. Auf diese Weise treffen Sie db nicht jedes Mal, wenn Sie nach Kategorien eines Produkts suchen müssen.

Jetzt verwenden Sie nur OutputCache in ProductList, und Sie haben eine ziemlich gute Leistung (teilweise) Ansicht.

+0

+1 für Ihren Rat, Kategorien zu cachen. aber was ich suche, ist ein Workaround, um diese Art von geschachteltem Ausgabe-Caching zu ermöglichen. der eigentliche Code ist komplizierter als das Beispiel –

+0

Ich denke, es gibt keine Problemumgehung. Daher habe ich Ihren Ratschlag zur Verwendung des OutputCache in ProductList und zum Erstellen eines benutzerdefinierten Caches für den Kategoriepfad des Produkts verwendet. –

0

Ich weiß nicht viel über MVC, aber „verschachtelte Caching“ machte mich fragen, warum VaryByParam mit nicht hier arbeiten ...

2

Wir haben ein ähnliches Problem hatte, und stellte fest, dass wir nicht wirklich tat NEED verschachtelte partielle Ausgabe-Caching überhaupt. Nachdem wir das übergeordnete Objekt zwischengespeichert hatten, wurde das untergeordnete Objekt nicht erneut aufgerufen, bis der Cache des übergeordneten Objekts abgelaufen war.

So könnte mein Rat sein: Cache die Eltern und das Kind wird bereits behandelt werden.