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

4

我正在使用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属性缓存我的输出的一部分,因此我创建了一个带有启用OutputCache属性的ProductList操作。

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

但我仍然需要在每个产品上缓存类别路径输出。因此,我创建了一个带有启用OutputCache属性的操作CategoryPath

<!-- 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 不允许在已被缓存的子操作的子操作上使用。

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

有没有绕过的方法?


请查看此链接:http://blog.stevensanderson.com/2008/10/15/partial-output-caching-in-aspnet-mvc/ - Korayem
4个回答

2

你能给一个使用的例子吗? - Anwar Chandra

2
我们曾经遇到过类似的问题,但实际上我们并不需要嵌套的部分输出缓存。一旦我们对父对象进行了缓存,子对象在父对象的缓存过期之前是不会再次调用的。
所以,我的建议是:缓存父对象,子对象就已经处理好了。

1
在你的 SQL.GetCategories 方法中,你可以获取所有类别并在缓存中进行缓存,如果尚未缓存。使用 LINQ TO OBJECTS 按 ProductID 过滤类别。这样做的好处是,每次需要查找产品类别时都无需访问数据库,提高了性能。
现在你只在 ProductList 上使用 OutputCache,视图性能还算不错。

感谢您提供缓存类别的建议。但我正在寻找一种解决方法,以启用这种嵌套输出缓存。实际代码比示例更复杂。 - Anwar Chandra
我想没有任何解决办法。因此,我采纳了您的建议,在ProductList上使用OutputCache,并为产品类别路径创建了自定义缓存。 - Anwar Chandra

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接