在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
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秒,在点击按钮或刷新,时间就又变化了。这是为什么呢?呵呵,数据被缓存了呗……
OutputCache指令告诉ASP.NET,一旦已经创建页面输出,就将其存储在缓存中。
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(); } 发现只有这块显示的时间是一直在变化,而其他的时间仍旧被缓存。
未完待续…… |
请发表评论