2010-12-27 4 views
4

Я использую Razor вид двигатель в ASP.Net MVC 3 RC 2. Это часть моего зрения city.cshtmlкэширование Уплотненного частичного выхода в ASP.NET MVC 3

(значительно упрощен код для простоты в пример)

<!-- 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> 

Я хочу, чтобы кэшировать эту часть моего выхода с помощью OutputCache атрибута, поэтому я создал действие ProductList с OutputCache атрибут включен

<!-- in city.cshtml --> 
<div class="list"> 
    @Html.Action("ProductList", new { City = Model.City }) 
</div> 

и я создал представление в ProductList.cshtml ниже

<!-- 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> 
} 

, но мне еще нужно кэшировать категории путь выход на каждом продукте. поэтому я создал действие CategoryPath с OutputCache атрибут включен

<!-- 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> 
} 

Но, видимо, это не допускается. Я получил эту ошибку:

OutputCacheAttribute is not allowed on child actions which are children of an already cached child action.

Я считаю, что у них есть веская причина, по которой они должны запретить это. Я действительно хочу такого типа Вложенное кэширование выходных данных.

Любая идея обходного решения?

+0

[Посмотрите эту ссылку] (http://blog.stevensanderson.com/2008/10/15/partial-output-caching-in-aspnet-mvc/) – Korayem

ответ

1

В вашем методе SQL.GetCategories вы можете получить все категории и кешировать его, если он еще не находится в кеше. И фильтруйте категории по идентификатору productID с помощью LINQ TO OBJECTS. Таким образом, вы не нажимаете db каждый раз, когда вам нужно найти категории продукта.

Теперь вы используете OutputCache только в ProductList, и у вас есть довольно приличное выполнение (частичное) представление.

+0

+1 за советы по кешированию категорий. но то, что я ищу, является обходным решением для включения такого кэширования выходных данных. фактический код более сложный, чем пример –

+0

Я думаю, что обходного пути нет. поэтому я принял ваш совет использовать OutputCache в ProductList и создать собственный кеш для пути к категории продукта. –

0

Я не знаю много о MVC, но «вложенная кэширование» заставило меня задаться вопросом, почему использование VaryByParam не будет работать здесь ...

2

У нас была аналогичная проблема, и обнаружил, что мы на самом деле не НУЖНО вложенное частичное кэширование вывода вообще. Как только мы кэшировали родительский объект, ребенок снова не вызывался до истечения срока действия кеша родителя.

Итак, мой совет может быть: Cache родительский, и ребенок уже будет обработан.