在页面上进行缓存后又要保证局部的数据不缓存,如何实现

在页面上进行缓存后又要保证局部的数据不缓存,如何实现
ASP.NET 课程问题

页面部分缓存是指输出缓存页面的某些部分,而不是缓存整个页面内容。实现页面部分缓存有两种机制:一种是将页面中需要缓存的部分置于用户控件(.ascx文件)中,并且为用户控件设置缓存功能(包含用户控件的ASP.NET页面可设置也可不设置缓存)。这就是通常所说的“控件缓存”。设置控件缓存的实质是对用户控件进行缓存配置。主要包括以下3种方法:一是使用@ OutputCache指令以声明方式为用户控件设置缓存功能,二是在代码隐藏文件中使用PartialCachingAttribute类设置用户控件缓存;三是使用ControlCachePolicy类以编程方式指定用户控件缓存设置。另外,还有一种称为“缓存后替换”的方法。该方法与控件缓存正好相反,将页面中的某一部分设置为不缓存,因此,尽管缓存了整个页面,但是当再次请求该页时,将重新处理那些没有设置为缓存的内容。

使用@ OutputCache指令

控件缓存与页面输出缓存的@ OutputCache指令既有相似之处,又有不同的方面。二者的共同点在于它们的设置方法基本相同,都是文件顶部设置包含属性的@ OutputCache指令字符串。不同点包括以下两个方面:一是控件缓存的@ OutputCache指令设置在用户控件文件中,而页面输出缓存的@ OutputCache设置在普通ASP.NET文件中。二是控件缓存的@ OutputCache指令只能设置6个属性,Duration、Shared、SqlDependency、VaryByControl、VaryByCustom和VaryByParam。而在页面输出缓存的@ OutputCache指令字符串中设置的属性多达10个。以上是设置控件缓存时需要注意的问题。下面列举了一些利用@ OutputCache指令设置控件缓存的示例,其中重点说明了VaryByParam和VaryByControl等属性应用。

用户控件中的@ OutputCache指令设置源代码

<%@ OutputCache Duration="120" VaryByParam="CategoryID;SelectedID"%>

以上代码设置用户控件缓存有效期时间是120秒,并且允许使用CategoryID和SelectedID参数来改变缓存。通过VaryByParam属性设置,在服务器缓存中可能存储多个用户控件的实例。例如,对于一个包含用户控件的页面,可能存在如下的URL链接。

包含用户控件的页面的URL链接

http://localhost/mypage.aspx?categoryid=foo&selectedid=0
http://localhost/mypage.aspx?categoryid=foo&selectedid=1

当请求如上URL地址的页面时,由于控件中@ OutputCache指令的设置,尤其是属性VaryByParam的设置,那么在服务器缓存中就会存储两个版本的用户控件缓存实例。

控件缓存设置除了支持以上所述VaryByParam属性外,还支持VaryByControl属性。VaryByParam属性基于使用POST或者GET方式发送的名称/值对来改变缓存,而VaryByControl属性通过用户控件文件中包含的服务器控件来改变缓存。下面是VaryByControl属性的应用示例代码。

用户控件中的@ OutputCache指令设置源代码

<%@ OutputCache Duration="120" VaryByParam="none" VaryByControl="Category" %>

以上代码设置缓存有效期是120秒,并且页面不随任何GET或POST参数改变(即使不使用VaryByParam属性,但是仍然需要在@ OutputControl指令中显式声明该属性)。如果用户控件中包含ID属性为“Category”的服务器控件(例如下拉框控件),那么缓存将根据该控件的变化来存储用户控件数据。

如果读者已经掌握了页面输出缓存的@ OutputCache指令设置方法,那么控件缓存的@ OutputCache指令也会迎刃而解,无非仅使用其中的6个属性而已。然而,可能会产生疑问:如果ASP.NET页面和其中包含的用户控件都通过@ OutputCache指令设置了缓存,那么缓存该如何运行呢?

遇到这个问题时,应掌握以下个基本原则:一是ASP.NET允许在页面和页面的用户控件中同时使用@ OutputCache指令设置缓存,并且允许设置不同的缓存过期时间值。二是如果页面输出缓存过期时间长于用户控件输出缓存过期时间,则页面的输出缓存持续时间优先。例如,如果页面输出缓存设置为100秒,而用户控件的输出缓存设置为50秒,则包括用户控件在内的整个页将在输出缓存中存储100秒,而与用户控件较短的时间设置无关。三是如果页面输出缓存过期时间比用户控件的输出缓存过期时间短,则即使已为某个请求重新生成该页面的其余部分,也将一直缓存用户控件直到其过期时间到期为止。例如,如果页面输出缓存设置为50秒,而用户控件输出缓存设置为100秒,则页面其余部分每到期两次,用户控件才到期一次。
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-04-29
如果页面的部分内容动态改变,而部分内容则是保持不变,我们则可以考虑用asp.net的局部缓存技术
有两种方案可以解决,一种是控件缓存,即把不变的内容做成用户控件,然后让此控件缓存,而整个页面不会缓存。另一种是缓存后替换,即整个页面缓存,而用Substitution控件来处理动态内容。
一:控件缓存
在控件的ascx页面山写<%@ OutputCache Duration="120" VaryByParam="None" %>本控件缓存120秒
或者在服务端
[PartialCaching(120)]
public partial class CachedControl : System.Web.UI.UserControl
{
// Class Code
}
注意两点:
1. 控件有缓存,所在页面也有缓存,如果控件缓存时间小于页面缓存时间,则页面缓存时间为主。
2. 如果控件缓存时间大于页面缓存时间,则页面缓存失效后控件仍然缓存。
二:缓存后替换
使用Substitution控件来实现,使用 MethodName 属性指定要在 Substitution 控件执行时调用的回调方法的名称
<asp:substitution id="Substitution1"
methodname="GetCurrentDateTime"
runat="Server">
</asp:substitution>
服务端方法:
public static string GetCurrentDateTime (HttpContext context)
{
return DateTime.Now.ToString ();
}
实例:
DataView dv=(DataView)Cache["dv"];
if(dv==null)
{
System.Data.SqlClient.SqlConnection sqlconn=new System.Data.SqlClient.SqlConnection("数据连接字符串");
System.Data.SqlClient.SqlDataAdapter cmd=new System.Data.SqlClient.SqlDataAdapter("select * from test",sqlconn);
DataSet ds=new DataSet();
cmd.Fill(ds,"test");
DG_main.DataSource=ds.Tables["test"].DefaultView;
Cache["dv"]=ds.Tables["test"].DefaultView;//设置缓存
}
else
{
DG_main.DataSource=Cache["dv"];//用缓存绑定
DG_main.DataBind();
}
Asp.Net缓存Cache使用一例
本例完成建立缓存,清除缓存使用缓存进行数据绑定

public DataSet createCache(){
//返回DataSet
DataSet ds=new DataSet();
OleDbConnection conn=new OleDbConnection

("provider=microsoft.jet.oledb.4.0;data source="+Server.MapPath("data.mdb"));
conn.Open();
string sql="select * from data1 order by createtime asc";
OleDbDataAdapter cmd=new OleDbDataAdapter(sql,conn);
cmd.Fill(ds);
cmd.Dispose();
conn.Dispose();
return ds;
}

private void Button1_Click(object sender, System.EventArgs e)
{//清除Cache
Cache.Remove("DataList");
Response.Write("缓存清除成功");
}

private void Button2_Click(object sender, System.EventArgs e)
{//建立Cache
if(Cache["DataList"]==null)
{
//缓存不存在建立缓存
Cache.Insert("DataList",(DataSet)createCache());
DataSet ds=(DataSet)Cache["DataList"];
DataGrid1.DataSource=ds;
DataGrid1.DataBind();
}
else
{
//缓存存在执行绑定
DataSet ds=(DataSet)Cache["DataList"];
DataGrid1.DataSource=ds;
DataGrid1.DataBind();
}
}
第2个回答  2010-04-29
在C:\Auotoexec.bat中加入
“C:\Windows\Smartdrv.exe

在页面上进行缓存后又要保证局部的数据不缓存,如何实现
实现页面部分缓存有两种机制:一种是将页面中需要缓存的部分置于用户控件(.ascx文件)中,并且为用户控件设置缓存功能(包含用户控件的ASP.NET页面可设置也可不设置缓存)。这就是通常所说的“控件缓存”。设置控件缓存的实质是对用户控件进行缓存配置。主要包括以下3种方法:一是使用@ OutputCache指令以声...

iframe子页面访问过后相应js 缓存在浏览器,怎么不缓存
通过请求多加一个值为随机数的参数,这样浏览器认为每次请求的页面都是新的而保证了iframe页面每次都是重新加载的。顶 0 踩 0

.net中用了缓存,如何判断数据库的数据是否有变动,然后更新缓存
一、SQL SERVER2005以上版本的依赖式缓存,这个解决方案就是当数据库的数据有更新的时候会自动更新到缓存里。具体怎么配置,网上查找下,教程很多。二、自己写数据库和缓存的数据同步代码。当客户端把更新数据库的数据操作的时候同时更新缓存里的数据。毕竟写比读少了很多。但是在写缓存的时候,必须注意一...

页面请求完成后手动按F5刷新页面,部分数据不进行缓存
清空下缓存 有个可能跟网页远端服务器稳定性 或 浏览器 或 病毒 或 页面当初撰写的代码有关 如果所有网站都这样 彻底删除你的IE 重新安装一个

清空浏览器缓存(提高浏览器性能和解决网页显示问题)
一、GoogleChrome浏览器 1.打开GoogleChrome浏览器,点击右上角的菜单按钮(三个竖直的点)。2.在菜单中选择“更多工具”,然后选择“清除浏览数据”。3.在弹出的对话框中,选择要清除的时间范围。如果要清除全部缓存,可以选择“全部时间”。4.勾选要清除的内容,一般建议勾选“缓存图片和文件”以及“...

form表单中怎么实现缓存?点击下一步之后再点击上一步 前面输入的数据不...
可以使用不刷新页面儿的方案 不要使用原生的表单进行提交,原生表单提交后都是要刷新页面儿的,可以通过ajax进行提交。这样提交后不会刷新页面,输入的数据还存在用户体验更好。

怎么在前端页面设置不让浏览器缓存
你好 HTTP1.0中通过Pragma 控制页面缓存,可以设置:Pragma或no-cache。网上有非常多的文章说明如何控制不让浏览器或中间缓存服务器缓存页面,通常设置的值为no- cache,不过这个值不这么保险,通常还加上Expires置为0来达到目的。但是如我们刻意需要浏览器或缓存服务器缓存住我们的页面这个值则要设置为 ...

vue2如何保持历史页面数据不变,实现返回后不重置数据
以下是实现组件缓存的代码示例。将路由入口包裹在``内,确保在不同页面间的切换后数据保持不变。HTML代码:在组件内部,根据外部参数动态加载数据,确保列表页能够响应分类参数变化并加载相应数据,同时保持数据不丢失。Vue还提供了`activated`生命周期钩子,当组件被激活时调用,用于在组件激活时根据外部参数...

如何避免logout后,后退按钮依旧显示缓存的有关问题
3) 用户退出后,如果点击浏览器上的后退按钮,Web应用将不能正确保护受保护的页面——在Session销毁后(用户退出)受保护的JSP页重新在浏览器中显示出来。然而,如果用户点击返回页面上的任何链接,Web应用将会跳转到登陆页面并提示Session has ended.Please log in. 阻止浏览器缓存 上述问题的根源在于大部分浏览器都有一...

...个页面添加按钮进去后一直都有上一次添加的数据参数在上面如何...
建议在路由钩子里面做判断,beforeRouterEnter

相似回答