Aspx页面添加
<asp:Label ID="Label2" runat="server" Text="Label"></asp:Label>
<asp:Button ID="Button2" runat="server" Text="Button" />
在对应的.cs文件的Pageload中上写上 TextBox2.Text = DateTime.Now.ToString();
运行该页面,可以发现时间会一直变化,
在aspx页面加上 <%@ OutputCache Duration="30" VaryByParam="none" %>
再次运行该页面,此时问题就出现了,不管怎么点击按钮,时间就是不变化,一直显示的是“刚才”的时间,如果刷新下页面,时间变化了,出现了“现在”的时间,再次点击按钮,时间“回到过去”了,在刷新,时间又“回去”了,一直点击或刷新,只会显示两个不同的时间……如果等上30秒,在点击按钮或刷新,时间就又变化了。这是为什么呢?呵呵,数据被缓存了呗……
Duration是以秒为单位的时间,即页面保留在缓存中的时间。一旦时间到达,则缓存的页面到期,从缓存中移除。下一个请求将重新执行该页面。
VaryByParam属性指示了外部变化是否会影响如何缓存页面,设置为None就意味着没有任何方面影响缓存,只缓存一个副本。
如果将VaryByParam设置为查询字符串变量的名称,这意味着你个对变量的每个不同值缓存页面的副本。
如:<%@ OutputCache Duration="30" VaryByParam="type" %>
然后用a.aspx?type=a 和a.aspx?type=b将得到两个不同的结果。当type=a时缓存,type=b时也缓存
再如:
<asp:DropDownList ID="DropDownList1" runat="server"
onselectedindexchanged="DropDownList1_SelectedIndexChanged"
AutoPostBack="True" >
<asp:ListItem>1</asp:ListItem>
<asp:ListItem>2</asp:ListItem>
<asp:ListItem>3</asp:ListItem>
<asp:ListItem>4</asp:ListItem>
<asp:ListItem>5</asp:ListItem>
<asp:ListItem>6</asp:ListItem>
<asp:ListItem>7</asp:ListItem>
<asp:ListItem>8</asp:ListItem>
</asp:DropDownList>
在DropDownList1_SelectedIndexChanged中添加 Label1.Text = DateTime.Now.ToString();
之后运行该页面,选择DropDownList之后DropDownList变为一个新的值,之后再选择,却发现DropDownList中显示的始终是第一个选择的那个值,而且输出的时间也不在发生变化,这是因为“缓存”,看解决办法:
<%@ OutputCache Duration="30" VaryByParam="none" VaryByControl="DropDownList1" %>
之后再次运行,选择一个以前没有选过的选项,会的到一个新的时间,但是当选择到与前面一样的话,时间就和刚才的一样,MSDN上的解释:“该属性将根据用户控件(通常是页面上的控件,例如,DropDownList)的成员的值改变该控件的缓存”
片段缓存:
片段缓存允许只缓存页面的一部分,其他内容则仍旧是动态的。如菜单和其他布局元素等。
片段缓存使用的语法与页面级输出缓存一样,但其应用于用户控件(.ascx 文件)而不是 Web 窗体(.aspx 文件)。
缓存后替换
是片段缓存的对立面,其中缓存页面,只有一部分是动态的。
通过那个Substitution控件来实现。该控件有个MethodName属性,该属性指向一个函数,该函数返回替换缓存中的数据字符串。
Substitution 控件调用的方法必须符合下面的标准:
1、此方法被定义为静态方法(在 Visual Basic 中为共享方法)。
2、此方法接受 HttpContext 类型的参数。
3、此方法返回 String 类型的值。
仍旧使用刚才的页面,然后添加Substitution控件,指定MethodName=“test“,在aspx.cs页面中添加
private static string Test(HttpContext context)
{
return DateTime.Now.ToString();
}
发现只有这块显示的时间是一直在变化,而其他的时间仍旧被缓存。
未完待续……