我在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 儿童行为是儿童的行为 已缓存的儿童行动。
我相信他们有充分的理由要求他们不要这样做。我真的想要这种嵌套的输出缓存。
有任何解决方法吗?
答案 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在这里不起作用...