Caching 如何使用Razor动态查询缓存页面的多个版本&;网络缓存

Caching 如何使用Razor动态查询缓存页面的多个版本&;网络缓存,caching,dynamic,razor,asp.net-webpages,webmatrix-2,Caching,Dynamic,Razor,Asp.net Webpages,Webmatrix 2,我决定实现缓存以提高产品页面的性能 每个页面都包含大量的产品图片 我在Razor视图中创建了以下代码 @{ var productID = UrlData[0].AsInt(); var cacheItemKey = "products"; var cacheHit = true; var data = WebCache.Get(cacheItemKey); var db = Database.Open("adldb"); if (data == null) { cacheHit

我决定实现缓存以提高产品页面的性能

每个页面都包含大量的产品图片

我在Razor视图中创建了以下代码

@{   
var productID = UrlData[0].AsInt();
var cacheItemKey = "products"; 
var cacheHit = true; 
var data = WebCache.Get(cacheItemKey);

var db = Database.Open("adldb");
if (data == null) { 
cacheHit = false; 
} 
if (cacheHit == false) {   
data = db.Query("SELECT * FROM Products WHERE ProductID = @0", productID).ToList();
WebCache.Set(cacheItemKey, data, 1, false);
}
}
我将数据与以下代码一起使用:

@foreach (dynamic p in data)
{
<a href="~/Products/View/@p.ProductID"
<img src="~/Thumbnail/@p.ProductID"></a>
}
@foreach(数据中的动态p)
{
}
缓存代码运行良好,但在传递新的查询字符串参数(更改页面版本)时,浏览器中的结果在声明的兑现时间内是相同的

如何缓存页面的每个版本

谢谢


Oleg

一种非常简单的方法可能是将密钥(
productID
)转换为字符串,并将其附加到您的
cacheItemKey
的名称中

<> P>所以你可以考虑改变线:

var cacheItemKey = "products"; 
全文如下:

var cacheItemKey = "products" + productID.ToString();
这将产生您想要的行为——基本上模仿
VaryByParam
设置

请记住,我没有添加任何类型的防御代码,这是你应该做的。


希望能有所帮助。

谢谢大卫,成功了!但“添加任何类型的防御代码”是什么意思?我对此不熟悉。在调用
ToString()
之前,我想在
productID
上测试
NULL
,但我认为如果数据有问题,它可能会在示例代码中的
AsInt()
处失败。。。所谓“防御代码”,我只是指添加代码来测试假设,通常与数据类型相关。这里有一个维基百科关于防御性编程的链接,上面说的比我能做的要好得多。如果您能将我的答案标记为已接受的答案,我将不胜感激。祝你度过愉快的一天。非常感谢大卫的回答!这真的很有用。当做奥列格