二、页面局部缓存

      上一篇返回目录 | 下一篇

      有时我们需要的功能不是缓存全部的页面,而是缓存页面上的某一个部分,其余部分是动态的,这时,就需要用到页面局部缓存,该缓存包括两个部分:控件缓存替换后缓存

      控件缓存(片段缓存)

      本缓存是之前提到过的,类似于页面输出缓存那样,建立一个用户控件,将需要缓存的信息写在控件内,并标记其为可缓存的,这样就缓存了控件内的信息,但是并没有缓存整个页面,这样就达到了页面局部缓存的目的。这种缓存比较适合页面的信息有较多的动态信息,少部分的静态信息,这样的情况可用页面局部缓存。

      声明方式也很简单,先建立一个用户控件(ascx),并且在其内部声明为可缓存的,如下所示:

可缓存的用户控件

 

      用户控件的后台代码为获取当前时间。

      再建立一个aspx页面来调用该控件,并且在页面上也方式一个Literal,来获取当前时间,以此产生对比的效果,页面前台如下所示:

控件缓存 - 前台代码

 

      浏览该页面,在每次刷新的时候可以看到,控件的时间每60秒才变化一次,而页面时间是伴随着每次刷新操作都在改变,这样就达到了页面局部缓存的目的。

      替换后缓存

      本缓存与上述的控件缓存正好相反,它是对整个页面除部分动态数据之外的部分进行缓存。有时,我们需要对整个aspx页面进行缓存,但是在这个页面中,又有部分数据需要和数据库实时交互的,其余的部分则是一成不变(或者很少变化)的静态数据,这时,就可以使用替换后缓存。

      在ASP.NET 2.0中,替换后缓存主要有三种方式:以声明方式使用Substitution控件、以编程方式使用Substitution控件API、以隐式方式使用控件。

      可以看到,前两种方法都是以Substitution控件为核心的,那么,何为Substitution控件呢?

      Substitution控件能够指定页面输出缓存中需要以动态内容替换该控件的部分,即:允许对整个页面进行输出缓存,然后使用该控件指出页面中不用缓存的部分。页面中可缓存的区域在和数据库交互完一次之后,直到缓存过期或被清除,才会再和数据库进行交互,而动态区域(即:Substitution控件所指定的区域)则每次收到请求时,都要和数据库进行交互。

      Substitution控件的使用

      先将页面设置成输出缓存,然后再在页面上放置该控件,即可实现替换后缓存,实例代码如下所示:

替换后缓存 - 前台代码

 

替换后缓存 - 后台代码

 

      根据上面的代码,可以看出,Substitution控件有一个很重要的属性:MethodName。该属性就是设置当前Substitution控件执行时所调用的方法名,不过此方法相当特殊,有三个条件必须满足(代码中注释写了的):

      1、此方法必须为静态的方法(private、protected、public 均可)

      2、此方法必须接受 HttpContext 类型的参数

      3、此方法必须返回 string 类型的值

      在页面请求时,Substitution控件会自动执行MethodName所指定的后台方法,而其返回值则直接显示在页面上。

      Substitution控件API的使用

      以下实例是通过编程的方式来实现替换后缓存。Substitution控件的回调方法必须是 HttpResponseSubstitutionCallback 委托定义的方法,有两个特征:返回类型必须是string,参数有且仅有一个,必须是HttpContext类型的。

    在编程实现Substitution控件的时候,还应该注意,此方法必须是线程安全的。示例代码如下所示:

替换后缓存(API方式)- 前台页面

 

替换后缓存(API方式)- 后台代码

 

      上面就是通过API方式来是想的替换后缓存,通过Substitution控件回调方法显示出来的内容是不会缓存的。

      在使用Substitution控件的时候,应该注意以下几个方面:

      1、本控件无法访问页面上的其它控件,意思就是检查或者更改其它控件的值,不过代码可以通过使用传递给它的参数(HttpContext)来访问页面上下文。

      2、在缓存页所包含的用户控件中可以包含本控件,但是在输出缓存用户控件中不能包含本控件。

      3、本控件不会呈现处任何标记,其位置所显示的内容完全取决于其回调方法的返回值。

      上一篇返回目录 | 下一篇

posted @ 2009-07-09 17:04  缺水的海豚  阅读(635)  评论(0编辑  收藏  举报