[转]ASP.NET 缓存(十二)--根据参数缓存用户控件的多个版本
![](http://www.opent.cn/images/weather/hn2_sunny.gif)
![](http://www.opent.cn/images/weather/hn2_t_sunny.gif)
![](http://www.opent.cn/images/level3.gif)
可以用以下两种方法改变到缓存的用户控件输出:指定用户控件名称以及查询字符串或窗体 POST 参数,或指定用户控件中所包含的 ASP.NET 服务器控件的 ID 属性。对于前者,使用@ OutputCache 指令的 VaryByParam 属性或将 VaryByParams 属性包括在位于用户控件代码隐藏文件的 PartialCachingAttribute 中。对于后者,使用 VaryByControl 属性或将 VaryByControls 属性包括在 PartialCachingAttribute 中。
注意 仅当用户控件回发并自行处理回发时,根据查询字符串或窗体 POST 参数改变到缓存的用户控件输出才有效。您不能回发到包含页并预期这种类型的用户控件输出缓存正常运行。
通过使用 VaryByControl 属性以声明方式缓存用户控件的多个版本
- 创建回发的用户控件。
- 将带有 Duration 和 VaryByControl 属性的 @ OutputCache 指令包括在 .ascx 文件中。
注意 如果在指令中使用了 VaryByControl 属性,则不需要包括 VaryByParam 属性。
- 将 VaryByControl 属性设置为用户控件中所包含的控件的 ID 属性值。
例如,以下 @ OutputCache 指令将用户控件的到期时间设置为 60 秒,并通过 ID 属性值为
State
的 ASP.NET 服务器控件改变该控件的输出。<%@ OutputCache Duration="60" VaryByControl="State" %>
通过使用 VaryByControls 属性以编程方式缓存用户控件的多个版本
- 在代码隐藏类中,创建向自身回发的用户控件代码。
- 在用户控件代码的开始处包括元数据 PartialCaching 属性。
- 在希望用户控件输出改变所依据的用户控件中,包括 duration 参数的一个值,并将 varyByControls 参数设置为 ASP.NET 服务器控件的 ID 属性值。
当包括在扩展 UserControl 类的代码之前时,下面的示例将 duration 设置为 60 秒并将 varybycontrols 设置为“State”。
[C#] [PartialCaching(60, null, State, null)] [Visual Basic] <PartialCaching(60, null, State, null)>
通过使用 VaryByParam 属性以声明方式缓存用户控件的多个版本
- 创建向自身回发的用户控件。
- 将带有 Duration 和 VaryByParam 属性的 @ OutputCache 指令包括在 .ascx 文件中。
注意 如果将 VaryByControl 属性包括在用户控件的 @ OutputCache 指令中,则不需要包括 VaryByParam 属性。不管包括哪个属性,如果不想使用它提供的功能,则将其值设置为 None。
- 将 VaryByParam 属性设置为要根据其改变用户控件的 GET 查询字符串或格式 POST 参数。
例如,以下 @ OutputCache 指令将用户控件的到期时间设置为 60 秒,并根据窗体 POST 或查询字符串参数
State
来改变控件的输出。<%@ OutputCache Duration="60" VaryByParam="State" %>
通过使用 VaryByParams 属性以编程方式缓存用户控件的多个版本
- 在代码隐藏类中,创建向自身回发的用户控件代码。
- 在用户控件代码的开始处包括元数据 PartialCaching 属性。
- 包括 duration 参数的值,并将 varyByParams 参数设置为改变用户控件输出所依据的 GET 查询字符串或窗体 POST 参数。
当包含在扩展 UserControl 类的代码之前时,以下示例将 duration 设置为 60 秒并将 varyByParams 设置为
State
窗体 POST 或查询字符串参数。[C#] [PartialCaching(60, State, null, null)] [Visual Basic] <PartialCaching(60, State, null, null)>
下面的示例通过将 ServerClick 事件的代码包括在控件的代码声明块中,演示回发到自身的用户控件。它还演示如何根据与用户控件中包含的两个 DropDownList Web 服务器控件关联的 State
和 Country
窗体 ID 属性值,使用 VaryByControl 参数将用户控件输出改变到输出缓存。另外,还包含 Shared 属性,该属性设置为 true 以允许多个页访问同一缓存用户控件输出。它还包括一个包含用户控件的简单的 .aspx 文件。若要使用以下示例,请将用户控件文件命名为 Sample.ascx
。
[sample.ascx] [C#] <%@ Control Language="C#" %> <%@ OutputCache Duration="30" VaryByControl="State;Country" Shared="true" %> <%@ import namespace="System.Globalization"%> <script runat=server> void SubmitBtn_Click(Object Sender, EventArgs e) { Label1.Text="You chose: " + state.SelectedItem.Text + " and " + country.SelectedItem.Text; TimeMsg.Text = DateTime.Now.ToString("T"); } </script> <asp:DropDownList id="state" runat="server"> <asp:ListItem> </asp:ListItem> <asp:ListItem>Idaho</asp:ListItem> <asp:ListItem>Montana</asp:ListItem> <asp:ListItem>Nevada</asp:ListItem> <asp:ListItem>Oregon</asp:ListItem> <asp:ListItem>Washington</asp:ListItem> <asp:ListItem>Wyoming</asp:ListItem> </asp:DropDownList> <br> <asp:DropDownList id="country" runat="server"> <asp:ListItem> </asp:ListItem> <asp:ListItem>Austria</asp:ListItem> <asp:ListItem>France</asp:ListItem> <asp:ListItem>Italy</asp:ListItem> <asp:ListItem>Germany</asp:ListItem> <asp:ListItem>Spain</asp:ListItem> <asp:ListItem>Switzerland</asp:ListItem> </asp:DropDownList> <br> <asp:button text="Submit" OnClick="SubmitBtn_Click" runat=server/> <br> <asp:Label id=Label1 font-name="Verdana" font-size="10pt" runat="server"> Select values from the lists </asp:Label> <br> <br> Control generated at: <asp:label id="TimeMsg" runat="server" /> [Visual Basic] <%@ Language="VB" %> <%@ OutputCache Duration="30" VaryByControl="State;Country" Shared="true" %> <%@ import namespace="System.Globalization"%> <script runat=server> Sub SubmitBtn_Click(Sender as Object, e as EventArgs) Label1.Text="You chose: " & state.SelectedItem.Text & " and " & country.SelectedItem.Text TimeMsg.Text = DateTime.Now.ToString("T") End Sub </script> <asp:DropDownList id=state runat="server"> <asp:ListItem> </asp:ListItem> <asp:ListItem>Idaho</asp:ListItem> <asp:ListItem>Montana</asp:ListItem> <asp:ListItem>Nevada</asp:ListItem> <asp:ListItem>Oregon</asp:ListItem> <asp:ListItem>Washington</asp:ListItem> <asp:ListItem>Wyoming</asp:ListItem> </asp:DropDownList> <br> <asp:DropDownList id=country runat="server"> <asp:ListItem> </asp:ListItem> <asp:ListItem>Austria</asp:ListItem> <asp:ListItem>France</asp:ListItem> <asp:ListItem>Italy</asp:ListItem> <asp:ListItem>Germany</asp:ListItem> <asp:ListItem>Spain</asp:ListItem> <asp:ListItem>Switzerland</asp:ListItem> </asp:DropDownList> <br> <asp:button text="Submit" OnClick="SubmitBtn_Click" runat=server/> <br> <asp:Label id=Label1 font-name="Verdana" font-size="10pt" runat="server"> Select values from the lists </asp:Label> <br> <br> Control generated at: <asp:label id="TimeMsg" runat="server" /> </script> [sample.aspx] <%@ Register TagPrefix="Sample" TagName="Places" Src="sample.ascx" %> <form runat=server> <Sample:Places id="Control1" runat=server /> </form>