ASP.Net 缓存 第一次接触

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();

}

发现只有这块显示的时间是一直在变化,而其他的时间仍旧被缓存。

 

未完待续……

posted @ 2010-02-27 21:16  hsrzyn  阅读(465)  评论(0编辑  收藏  举报