我在页面SqlAccess.aspx中放置了一个SqlDataSource和一个GridView控件用来显示数据的信息,又加入了2个Url用来为select * from people where name = @name 语句提供@name参数,
<a href="SqlAccess.aspx?name=yin">YIN</a>
<a href="SqlAccess.aspx?name=ji">JI</a>现在页面可以根据用户点击url的不同来为不同的页面缓存数据,但假如页面没有第2页一切正常,但如果记录数大于1页,当你点击2的时候,页面显示第二页信息,当你再点第一页或其他页的时候,页面就没反映了,始终显示这一页的信息!????我觉的是<%@ OutputCache Duration="60" VaryByParam="name" %>中的VaryByParam属性必须通过Post或Get方式触发才可以刷新缓存,而PageIndex的变化没有触发缓存刷新,所以还是显示上次刷新后的数据!代码如下:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="SqlAccess.aspx.cs" Inherits="PageCache_SqlAccess2" %>
<%@ OutputCache Duration="60" VaryByParam="name" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html>
<body>
<form id="Form1" runat="server">
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataSourceID="SqlDataSource1" AllowPaging="True" PageSize="5">
<Columns>
<asp:BoundField DataField="id" HeaderText="id" InsertVisible="False" SortExpression="id" />
<asp:BoundField DataField="name" HeaderText="name" SortExpression="name" />
<asp:BoundField DataField="salary" HeaderText="salary" SortExpression="salary" />
<asp:BoundField DataField="birthday" HeaderText="birthday" SortExpression="birthday" />
</Columns>
</asp:GridView>
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:testConnectionString %>" SelectCommand="SELECT * FROM [people] where name = @name">
<SelectParameters>
<asp:QueryStringParameter DefaultValue="" Name="name" QueryStringField="name" />
</SelectParameters>
</asp:SqlDataSource>
<br />
<a href="SqlAccess.aspx?name=yin">YIN</a>
<a href="SqlAccess.aspx?name=ji">JI</a>
<p>
<i>最后更新于:</i>
<asp:Label ID="TimeMsg" runat="server" />
</form>
</body>
</html>
<a href="SqlAccess.aspx?name=yin">YIN</a>
<a href="SqlAccess.aspx?name=ji">JI</a>现在页面可以根据用户点击url的不同来为不同的页面缓存数据,但假如页面没有第2页一切正常,但如果记录数大于1页,当你点击2的时候,页面显示第二页信息,当你再点第一页或其他页的时候,页面就没反映了,始终显示这一页的信息!????我觉的是<%@ OutputCache Duration="60" VaryByParam="name" %>中的VaryByParam属性必须通过Post或Get方式触发才可以刷新缓存,而PageIndex的变化没有触发缓存刷新,所以还是显示上次刷新后的数据!代码如下:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="SqlAccess.aspx.cs" Inherits="PageCache_SqlAccess2" %>
<%@ OutputCache Duration="60" VaryByParam="name" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html>
<body>
<form id="Form1" runat="server">
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataSourceID="SqlDataSource1" AllowPaging="True" PageSize="5">
<Columns>
<asp:BoundField DataField="id" HeaderText="id" InsertVisible="False" SortExpression="id" />
<asp:BoundField DataField="name" HeaderText="name" SortExpression="name" />
<asp:BoundField DataField="salary" HeaderText="salary" SortExpression="salary" />
<asp:BoundField DataField="birthday" HeaderText="birthday" SortExpression="birthday" />
</Columns>
</asp:GridView>
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:testConnectionString %>" SelectCommand="SELECT * FROM [people] where name = @name">
<SelectParameters>
<asp:QueryStringParameter DefaultValue="" Name="name" QueryStringField="name" />
</SelectParameters>
</asp:SqlDataSource>
<br />
<a href="SqlAccess.aspx?name=yin">YIN</a>
<a href="SqlAccess.aspx?name=ji">JI</a>
<p>
<i>最后更新于:</i>
<asp:Label ID="TimeMsg" runat="server" />
</form>
</body>
</html>
页面缓存的问题,页面第一次调用的时候就把信息存储在内在中,
Duration="60" 就是把信息保存在内存中60秒,
而这期间不会有改变了.
你可以更改 Duration 的大小,或者去掉 页面缓存,
我明白你的意思,我现在的问题就是可以不可以在准许用户查询后显示多条记录的页面中使用缓存,如果这个方法不好哪什么方法更好?
你可以在datagrid 或datalist 或 Repeater中 加上, EnableViewState="false"
这也是性能优化的方法之一,
这样还缓存什么啊!动态页面还是不要加页面缓存,我可以应用可以把DataView保存在Cache[]里面,这也是一个不错的办法,但这就是2003的老内容了,不知道2005有没有新方法!