ASP.NET 缓存,十三--根据参数缓存用户控件的多个版本

可以用以下两种方法改变到缓存的用户控件输出:指定用户控件名称以及查询字符串或窗体 POST 参数,或指定用户控件中所包含的 ASP.NET 服务器控件的 ID 属性。对于前者,使用@ OutputCache 指令的 VaryByParam 属性或将 VaryByParams 属性包括在位于用户控件代码隐藏文件的 PartialCachingAttribute 中。对于后者,使用 VaryByControl 属性或将 VaryByControls 属性包括在 PartialCachingAttribute 中。

注意 仅当用户控件回发并自行处理回发时,根据查询字符串或窗体 POST 参数改变到缓存的用户控件输出才有效。您不能回发到包含页并预期这种类型的用户控件输出缓存正常运行。

通过使用 VaryByControl 属性以声明方式缓存用户控件的多个版本

  1. 创建回发的用户控件。
  2. 将带有 DurationVaryByControl 属性的 @ OutputCache 指令包括在 .ascx 文件中。
    注意 如果在指令中使用了 VaryByControl 属性,则不需要包括 VaryByParam 属性。
  3. VaryByControl 属性设置为用户控件中所包含的控件的 ID 属性值。

    例如,以下 @ OutputCache 指令将用户控件的到期时间设置为 60 秒,并通过 ID 属性值为 State 的 ASP.NET 服务器控件改变该控件的输出。

    <%@ OutputCache Duration="60" VaryByControl="State" %>

通过使用 VaryByControls 属性以编程方式缓存用户控件的多个版本

  1. 在代码隐藏类中,创建向自身回发的用户控件代码。
  2. 在用户控件代码的开始处包括元数据 PartialCaching 属性。
  3. 在希望用户控件输出改变所依据的用户控件中,包括 duration 参数的一个值,并将 varyByControls 参数设置为 ASP.NET 服务器控件的 ID 属性值。

    当包括在扩展 UserControl 类的代码之前时,下面的示例将 duration 设置为 60 秒并将 varybycontrols 设置为“State”。

    [C#]
        [PartialCaching(60, null, State, null)]
        [Visual Basic]
        <PartialCaching(60, null, State, null)>

通过使用 VaryByParam 属性以声明方式缓存用户控件的多个版本

  1. 创建向自身回发的用户控件。
  2. 将带有 DurationVaryByParam 属性的 @ OutputCache 指令包括在 .ascx 文件中。
    注意 如果将 VaryByControl 属性包括在用户控件的 @ OutputCache 指令中,则不需要包括 VaryByParam 属性。不管包括哪个属性,如果不想使用它提供的功能,则将其值设置为 None
  3. VaryByParam 属性设置为要根据其改变用户控件的 GET 查询字符串或格式 POST 参数。

    例如,以下 @ OutputCache 指令将用户控件的到期时间设置为 60 秒,并根据窗体 POST 或查询字符串参数 State 来改变控件的输出。

    <%@ OutputCache Duration="60" VaryByParam="State" %>

通过使用 VaryByParams 属性以编程方式缓存用户控件的多个版本

  1. 在代码隐藏类中,创建向自身回发的用户控件代码。
  2. 在用户控件代码的开始处包括元数据 PartialCaching 属性。
  3. 包括 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 服务器控件关联的 StateCountry 窗体 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 >
<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 >
<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 Verdana" font-size="10pt" runat="server">
Select values from the lists
</asp:Label>
<br> <br>
Control generated at: <asp:label  />
[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 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 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 Verdana" font-size="10pt" runat="server">
Select values from the lists
</asp:Label>
<br> <br>
Control generated at: <asp:label  />
</script>
[sample.aspx]
<%@ Register TagPrefix="Sample" TagName="Places"
Src="sample.ascx" %>
<form runat=server>
<Sample:Places  runat=server />
</form>