[转]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)
就像可以改变已进行输出缓存的页的版本一样,您可以输出缓存具有用户控件的页的区域。通过根据控件的名称和 GET 查询字符串或窗体 POST 参数值,或只根据参数值改变用户控件输出,您可以完成该操作。通过在它所包含的 .aspx 文件中对用户控件进行多次声明,您也可以缓存页上用户控件的多个版本。您可以使用这些技术中的任何一个,不管是在 .ascx 文件中使用 @ OutputCache 指令指定用户控件的输出缓存,还是当在代码隐藏类中开发用户控件时使用 PartialCachingAttribute。
用户控件的 @ OutputCache 指令支持四个属性:VaryByParam、VaryByCustom、VaryByControl 和 Shared。PartialCachingAttribute 类包括以下四个属性:VaryByParams、VaryByControls、VaryByCustom 和 Shared,这些属性允许您通过将属性添加到代码隐瞒类的用户控件中来使用相同的技术。
当首次对包含具有输出缓存设置的用户控件的 ASP.NET 页进行请求时,控件输出的实例将保存到内存中。默认情况下,包含同一用户控件的每一页都将会在请求该页时将控件输出的另一个实例添加到内存中。
例如,如果创建了一个具有输出缓存设置的用户控件 sample.ascx,并将 sample.ascx 添加到了应用程序的 25 个 ASP.NET 页中,则输出缓存中至少会存储 25 个 sample.ascx 版本。另外,如果使用 VaryByControl、VaryByCustom 或 VaryByParam 属性修改用户控件的缓存行为,则缓存中将会有更多的用户控件输出版本。例如,假定您将 TextBox Web 服务器控件包含在用户控件中,并将其 ID 属性设置为 MyTextBox
。如果将 VaryByControl 属性设置为 MyTextBox,则对于 MyTextBox 控件接收到的每个值,都将会有一个用户控件输出版本存储在缓存中。
如果在同一应用程序的多个页中使用了相同的用户控件,则可以通过以下方法来节省内存:将用户控件 @ OutputCache 指令的 Shared 属性设置为 true,或将 PartialCachingAttribute.Shared 属性设置为 true。这意味着每个页都将访问用户控件输出的同一实例。对于经常使用和频繁缓存的用户控件,使用 Shared 属性可以节省大量的内存。
将用户控件输出添加到输出缓存中和对页输出进行相同的操作这两者存在一个主要区别。尽管两者的输出缓存都支持使用 GET 查询字符串和窗体 POST 参数创建和缓存输出的多个版本,但用户控件不支持基于 HTTP 标头的缓存。
您可以使用以下四种技术来改变输出缓存的用户控件:
- 可以使用 VaryByParam 属性或 PartialCachingAttribute.VaryByParams 属性,它们提供的功能与为页输出缓存所提供的相同。可以将这两种属性的任意一种设置为任何字符串,但需要将其等同于与所创建用户控件关联的 GET 查询字符串或格式 POST 参数。
- 可以使用 VaryByControl 属性或 PartialCachingAttribute.VaryByControls 属性,根据用户控件所包含的 ASP.NET 服务器控件 ID 来改变输出缓存用户控件。
- 可以使用 VaryByCustom 属性或 PartialCachingAttribute.VaryByCustom 属性,为改变用户控件输出所依据的自定义字符串定义代码。此方法的工作方式与改变页输出缓存的 VaryByControl 方法相同。有关更多信息,请参见根据自定义字符串缓存页版本。
- 可以在 ASP.NET 页中包含用户控件的多个实例。每个控件实例的输出都将被缓存,除非您将 @ OutputCache 指令的 Shared 属性设置为 true。
有关这些主题中每个主题的详细信息,请参见根据参数缓存用户控件的多个版本和通过使用声明性的属性缓存用户控件的多个版本。