这是我创建的一个示例演示,试图解释一下关于VaryByParam属性的OutputCache:
标记:
<%@ OutputCache Duration="10" VaryByParam="ID" %>
<asp:Button ID="SetQueryStringButton1" runat="server"
Text="Set query string ID=1 and redirect"
PostBackUrl="~/OutputCachingUsingQueryString/Default.aspx?ID=1" />
<br />
<asp:Button ID="SetQueryStringButton2" runat="server"
Text="Set query string ID=2 and redirect"
PostBackUrl="~/OutputCachingUsingQueryString/Default.aspx?ID=2" />
<br />
<asp:Button ID="SetQueryStringButton3" runat="server"
Text="Set different query string and redirect"
PostBackUrl="~/OutputCachingUsingQueryString/Default.aspx?ABCD=3" />守则-幕后:
if (IsPostBack)
{
string key = Request.QueryString.GetKey(0);
MessageLabel.Text = "The value of query string " + key + " is : " + Request.QueryString[key] + "<br/>";
MessageLabel.Text += DateTime.Now.ToLongTimeString();
}当我单击前两个按钮时,根据VaryByParam的定义,它将页面缓存为ID =1和ID = 2。但是,当我单击第三个按钮时,它会缓存页面的ABCD=3。我所期望的是,页面不应该为ABCD=3缓存,因为我没有在VaryByParam中指定它。当我反复单击第三个按钮时,我会得到相同的dateTime。
编辑开始:我也尝试过这样做:
标记:
<%@ OutputCache Duration="10" VaryByParam="ID" %>
<asp:Label ID="MessageLabel" runat="server"/><br/>
<a href="Default.aspx?ID=1">Click Me and pass ID=1</a><br/>
<a href="Default.aspx?ID=2">Click Me and pass ID=2</a><br/>
<a href="Default.aspx?ABCD=3">Click Me and pass ABCD=3</a><br/>守则-幕后:
if (!IsPostBack)
{
if (Request.QueryString.Keys.Count > 0)
{
string key = Request.QueryString.GetKey(0);
MessageLabel.Text = "The value of query string: " + key + " is: " + Request.QueryString[key] + "<br/>";
MessageLabel.Text += DateTime.Now.ToString();
}
}当我单击第三个按钮时,它会在我点击它几次之后显示它。我在这里遇到的一些奇怪的行为。
编辑端
请弄清楚我做错了什么?提前谢谢。
发布于 2012-05-09 14:46:29
您是否将OutputCache指令放置在Default.aspx页面中?据我所见,您正在从具有OutputCaching指令的页面回发到OutputCaching.
PostBackUrl: 单击Button控件时要从当前页面发布的网页的URL。默认值是一个空字符串(""),它会导致页面回发到它自己。
编辑:
我尝试了同样的场景,得到了同样的结果。无论我点击第三个按钮多少次,页面仍然被缓存。我查看了Firebug,在第一次单击之后,我可以看到这个信息:
Response Headersview
Cache-Control public, max-age=10然后,在连续点击后,最大年龄减少。只有当最大年龄达到0时,才会再次从服务器请求页面.这是预期的行为。
问题是:第三个按钮正在传递一个不同的param (ABCD),页面在不应该缓存时继续被缓存,因为OutputCache指令指定了不同的param (ID):
<%@ OutputCache Duration="10" VaryByParam="ID" %>所以,我也想知道为什么会这样.由于第三个按钮传递一个不同的param (ABCD),它不应该缓存页面(根据我对MSDN文档的理解)。也许我们都误会了。
发布于 2017-07-01 19:22:07
这就是OutputCache在使用VaryByParam = " ID“时的工作方式--它为每个请求执行一个单独的缓存版本,每个请求的键ID值不同。如果用户执行了一个不使用ID的请求,那么将创建一个新的缓存版本。示例:
因此,我们可以得出的结论是,如果执行VaryByParam=ID,那么我们使用的每个值都将使用一个新版本。如果在请求中不使用该param,则将创建一个单独的缓存版本,并在下一个请求中重用。
https://stackoverflow.com/questions/10517967
复制相似问题