本文演示如何在 ASP.NET 中实现片段缓存。实际上,片段缓存并不直接缓存 Web 窗体的代码片段,而是缓存 Web 窗体中的各个用户控件 (.ascx)。各个用户控件可以有独立的缓存持续时间和缓存行为的实现方式。本文中的示例代码演示了如何实现此功能。
片段缓存在您只想缓存页面的一个子集时很有用。导航栏、页眉和页脚都是很好的片段缓存候选对象。
回到顶端
要求
• |
Microsoft Windows 2000 |
• |
Microsoft Internet Information Server (IIS) |
• |
Microsoft .NET Framework |
• |
ASP.NET |
回到顶端
使用 C# .NET 创建 ASP.NET Web 应用程序
下列步骤演示如何新建一个名为 FragmentCache 的 ASP.NET Web 应用程序。
1. |
打开 Microsoft Visual Studio .NET。 |
2. |
在文件菜单上,指向新建,然后单击项目。 |
3. |
在新建项目对话框中,单击项目类型下的 Visual C# 项目,然后单击模板下的 ASP.NET Web 应用程序。 |
4. |
在名称框中,键入 FragmentCache。在位置框中,选择适当的服务器。如果您是在使用本地服务器,可以将服务器名保留为 http://localhost。 |
回到顶端
创建用户控件
这一节提供了本文中将用到的各个用户控件的示例代码及其解释。您可以按如下所述将示例代码复制并粘贴到关联的 .ascx 文件和代码隐藏页中。
用户控件 1 (FragmentCtrl1.ascx)
下面的用户控件 FragmentCtrl1.ascx 非常简单。FragmentCtrl1.ascx 写出了项目的缓存条目出现的时间。就本文中创建的所有控件而言,对各控件都提供了基本描述,以便在后面几节中可以更容易地辨别设置及其关联的运行时行为。
1. |
在 Visual Studio .NET 中,按如下所述新建一个用户控件:
a. |
在解决方案资源管理器中,右键单击该项目节点,指向添加,然后单击“添加 Web 用户控件”。 |
b. |
将控件命名为 FragmentCtrl1.ascx,然后单击打开。 | |
2. |
确保选择了设计选项卡。单击一个 Web 窗体 Label 控件,并将它从工具箱的 Web 窗体部分拖出,然后将此 Label 控件放置在页面上。 |
3. |
单击 Label 控件。在 Visual Studio .NET 集成开发环境 (IDE) 的“属性”窗格中,在 ID 属性中键入 CacheEntryTime,并将 Text 属性留空。 |
4. |
切换到 HTML 视图,并将下面的 @OutputCache 指令添加到页面顶部:<%@ OutputCache Duration="40" VaryByParam="none"%>
|
5. |
右键单击 .ascx 文件,然后单击查看代码以显示代码隐藏页的源代码。 |
6. |
将下面的代码添加到 Page_Load 事件中,它将设置 CacheEntryTime 标签的 Text 属性:private void Page_Load(object sender, System.EventArgs e)
{
CacheEntryTime.Text ="FragmentCtrl1: " + DateTime.Now.TimeOfDay.ToString();
}
|
用户控件 2 (FragmentCtrl2.ascx)
尽管只需使用一个不同的缓存持续时间来创建第一个控件的另一版本,就能显示出多个用户控件在同一页面中可以有彼此独立的行为,本节还是创建了第二个控件 FragmentCtrl2.ascx,这样会更有趣。FragmentCtrl2.ascx 用于引入
VaryByControl 属性。
VaryByControl 允许根据指定控件的值来建立不同的缓存条目。下一节中可以更清楚地看到运行时的这一功能。
1. |
在 Visual Studio .NET 中,按如下所述新建一个用户控件:
a. |
在解决方案资源管理器中,右键单击该项目节点,指向添加,然后单击“添加 Web 用户控件”。 |
b. |
将控件命名为 FragmentCtrl2.ascx,然后单击打开。 | |
2. |
确保选择了设计选项卡。单击一个 Web 窗体 Label 控件,并将它从工具箱的 Web 窗体部分拖出,然后将此 Label 控件放置在页面上。 |
3. |
单击 Label 控件。在“属性”窗格的 ID 属性中键入 CacheEntryTime,并将 Text 属性留空。 |
4. |
将光标直接放在 Label 控件之后,然后按 Enter 键移动到页面上的下一行。 |
5. |
单击一个 Web 窗体 RadioButtonList 控件,并将它从工具箱的 Web 窗体部分拖出,然后将它放置在页面上。RadioButtonList 控件应该出现在 Label 控件之后,单独占一行。 |
6. |
单击 RadioButtonList 控件。在“属性”窗格中的 ID 属性中键入 MyRadioButtonList。 |
7. |
在“属性”窗格中,找到 MyRadioButtonList 控件的 Items 属性,单击集合,然后单击集合旁显示的省略号 (...) 按钮。 |
8. |
在 ListItem 集合编辑器窗口中,按下面的方式添加 ListItem 成员:
a. |
在成员下,单击添加。 |
b. |
在 ListItem 属性部分,将 Text 和 Value 设置为是,将 Selected 设置为 True。 |
c. |
在成员下,再次单击添加。 |
d. |
在 ListItem 属性部分,将 Text 和 Value 设置为否,将 Selected 设置为 False。 |
e. |
在成员下,最后一次单击添加。 |
f. |
在 ListItem 属性部分中,将 Text 和 Value 设置为可能,将 Selected 设置为 False。 |
g. |
单击确定返回到设计视图中的 .ascx 文件。注意出现了三个单选按钮,它们包含在 RadioButtonList 控件中:是、否和可能。 | |
9. |
将光标直接放在 RadioButtonList 控件之后,然后按 Enter 键移动到页面上的下一行。 |
10. |
单击一个 Web 窗体 Button 控件,并将它从工具箱的 Web 窗体部分拖出,然后将它放置在页面上。Button 控件应该出现在 RadioButtonList 控件之后,单独占一行。 |
11. |
单击 Button 控件。在“属性”窗格中,在 Text 属性中键入提交。 |
12. |
切换到 HTML 视图,并将下面的 @OutputCache 指令添加到页面顶部:<%@ OutputCache Duration="60" VaryByParam="none" VaryByControl="MyRadioButtonList"%>
|
13. |
右键单击 .ascx 文件,然后单击查看代码以显示代码隐藏页的源代码。 |
14. |
将下面的代码添加到 Page_Load 事件中,它将设置 CacheEntryTime 标签的 Text 属性:private void Page_Load(object sender, System.EventArgs e)
{
CacheEntryTime.Text = "FragmentCtrl2: " + DateTime.Now.TimeOfDay.ToString();
}
|
回到顶端
创建 Web 窗体以包含用户控件
现在您可以创建 Web 窗体 (.aspx) 来包含新创建的用户控件。要创建 Web 窗体,请按照下列步骤操作:
1. |
在 Visual Studio .NET 中按下面的方式将一个名为 FragmentCaching.aspx 的 Web 窗体添加到您的项目中:
a. |
在解决方案资源管理器中,右键单击该项目节点,指向添加,然后单击“添加 Web 窗体”。 |
b. |
将 Web 窗体命名为 FragmentCaching.aspx,然后单击打开。 | |
2. |
确保选择了设计选项卡。单击一个 Web 窗体 Label 控件,并将它从工具箱的 Web 窗体部分拖出,然后将它放置在页面上。 |
3. |
单击 Label 控件。在“属性”窗格的 ID 属性中键入 Time,并将 Text 属性留空。 |
4. |
将光标直接放在 Label 控件之后,然后按 Enter 键移动到页面上的下一行。 |
5. |
拖动 FragmentCtrl1.ascx,并将它放到 Web 窗体上,使其位于 Label 控件之后,并单独占一行。将光标直接放在该控件之后,然后按 Enter 键移动到页面上的下一行。 |
6. |
拖动 FragmentCtrl2.ascx,并将它放到 Web 窗体上,使其位于 FragmentCtrl1.ascx 之后,并单独占一行。 |
7. |
在 HTML 视图中,Web 窗体应类似于下面的代码: <%@ Page language ="c#" Codebehind="FragmentCaching.aspx.cs"
AutoEventWireup="false" Inherits="FragmentCache.FragmentCaching" %>
<%@ Register TagPrefix="uc1" TagName="FragmentCtrl1" Src="FragmentCtrl1.ascx" %>
<%@ Register TagPrefix="uc1" TagName="FragmentCtrl2" Src="FragmentCtrl2.ascx" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<HEAD>
<meta name="GENERATOR" Content="Microsoft Visual Studio 7.0">
<meta name="CODE_LANGUAGE" Content="C#">
<meta name="vs_defaultClientScript" content="JavaScript (ECMAScript)">
<meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
</HEAD>
<body>
<form id="FragmentCaching" method="post" runat="server">
<P>
WebForm Time:
<asp:Label id="Time" runat="server" ForeColor="Blue"></asp:Label>
</P>
<P>
<uc1:FragmentCtrl1 id="FragmentCtrl11" runat="server">
</uc1:FragmentCtrl1>
</P>
<P>
<uc1:FragmentCtrl2 id="FragmentCtrl21" runat="server">
</uc1:FragmentCtrl2>
</P>
</form>
</body>
</HTML>
注意:确保控件放在 Web 窗体标记内。 |
8. |
右键单击 .aspx 文件,然后单击查看代码以显示代码隐藏页的源代码。 |
9. |
将以下代码添加到 Page_Load 事件中,它将设置 Time 标签的 Text 属性:private void Page_Load(object sender, System.EventArgs e)
{
Time.Text = "WebFormTime: " + DateTime.Now.TimeOfDay.ToString();
}
|
10. |
从文件菜单中,单击全部保存,以保存用户控件、Web 窗体和其他相关项目文件。 |
11. |
在 Visual Studio .NET 集成开发环境 (IDE) 的生成菜单中,单击生成以生成该项目。 |
回到顶端
运行示例代码
这一节演示如何在运行时查看代码以验证缓存行为,然后简要介绍为什么该代码以这一方式执行。
1. |
在 Visual Studio .NET IDE 解决方案资源管理器中,右键单击 FragmentCaching.aspx Web 窗体,然后单击在浏览器中查看以运行该代码。 |
2. |
当页面出现在浏览器中后,右键单击该页面,然后单击刷新以刷新页面。如果您是在 Visual Studio .NET IDE 之外的浏览器中查看该页,也可以按 F5 键来刷新页面。
注意 Web 窗体上的时间已更新,而用户控件仍显示建立它们关联的缓存条目时的时间。 |
3. |
在第二个控件中,单击提交。注意该控件显示的是更新后的时间。这是对引用 RadioButtonList 控件的用户控件的 VaryByControl 属性设置的响应。 |
4. |
单击否,然后再次单击提交。注意用户控件所显示的时间又一次更新了。这是因为基于此否值设置,又为控件建立了一个新的缓存条目。
重复此步骤,可能选项除外。您会看到相同的行为。 |
5. |
单击是,然后再次单击提交。对否和可能选项重复此操作。注意,对控件做出的这些选择被缓存起来,而且它们显示的是上一缓存条目的时间。如果在过了 @ OutputCache 指令的持续时间设置后继续单击提交,则用户控件的时间将针对为 RadioButtonList 控件选择的每个特定值进行更新。 |
注意:本文的目的并不是要讲述片段缓存的所有可能的设置和情形。有关更多信息,请参阅本文结尾的
参考 一节。
回到顶端
疑难解答
• |
不要尝试以编程方式对输出缓存的用户控件进行操作。因为此控件只是在缓存条目出现前第一次运行时动态创建的。输出缓存将满足所有其他请求的需要,直到控件过期。 |
• |
如果用户控件所在的 Web 窗体的输出缓存持续时间比用户控件的持续时间长,则 Web 窗体的设置将决定控件的缓存行为。 |
回到顶端
有关 ASP.NET 缓存的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
307225 (http://support.microsoft.com/kb/307225/) INFO:ASP.NET 缓存概述
有关 ASP.NET 快速入门指南中介绍的 ASP.NET 缓存的信息和示例,请访问下面的 Microsoft 网站:
评论