ASP.NET MVC 3中的嵌套部分输出缓存

时间:2010-12-27 21:09:23

标签: asp.net-mvc asp.net-mvc-3 outputcache

我在ASP.Net MVC 3 RC 2中使用Razor视图引擎。这是我的观点的一部分city.cshtml

(为了简化示例,代码大幅简化)

<!-- 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   儿童行为是儿童的行为   已缓存的儿童行动。

我相信他们有充分的理由要求他们不要这样做。我真的想要这种嵌套的输出缓存

有任何解决方法吗?

4 个答案:

答案 0 :(得分:2)

使用Child Action Cache进行CategoryPath操作。还有example of ChildActionOnly in action

答案 1 :(得分:2)

我们遇到了类似的问题,发现我们实际上并不需要嵌套的部分输出缓存。一旦我们缓存了父对象,在父缓存过期之前不会再次调用该子对象。

所以,我的建议可能是:缓存父母,孩子将会被处理。

答案 2 :(得分:1)

在SQL.GetCategories方法中,如果尚未在缓存中,您可以获取所有类别并对其进行缓存。并使用LINQ TO OBJECTS按productID过滤类别。这样,每次需要查找产品类别时都不会点击db。

现在你只在ProductList上使用OutputCache,你有一个相当不错的表演(部分)视图。

答案 3 :(得分:0)

我对MVC知之甚少,但“嵌套缓存”让我想知道为什么使用varybyparam在这里不起作用...