要回答你的第一个问题,让我先告诉你,你的问题本身就有答案;)。'Shared' ... 是的,这就是关键字 :) 要在缓存中为所有页面的用户控件提供一个实例,请在 @OutputCache 指令中设置 Shared='true'。这应该在用户控制级别设置,即在 ascx 页面中。
要基于用户控件属性缓存用户控件,您应该在 PartialCachingAttribute 的 varyByControls 部分中指定属性的完全限定名称。多个属性(如果有)应以分号分隔。
<%@ Control Language="C#" AutoEventWireup="true"
CodeFile="WebUserControl.ascx.cs"
Inherits="UC_WebUserControl" %>
<%@ OutputCache Duration="60"
VaryByControl="UC_WebUserControl.param1;UC_WebUserControl.param2"
VaryByParam="none" Shared="true" %>
或者您还可以包含用户控件的 PartialCache 属性:
[PartialCaching(60, null, "UC_WebUserControl.param1;UC_WebUserControl.param2", null, true)]
public partial class UC_WebUserControl : System.Web.UI.UserControl
{
public string param1 { get; set; }
public string param2 { get; set; }
}
或者另一种缓存控制两个值组合的方法是:
[PartialCaching(60, null, "UC_WebUserControl.BothParams", null, true)]
public partial class UC_WebUserControl : System.Web.UI.UserControl
{
public string param1 { get; set; }
public string param2 { get; set; }
public string BothParams
{
get { return String.Concat(param1, param2); }
}
}
最后一个参数 (true) 指定共享。持续时间由 60 指定。请参阅链接How to: Cache Multiple Versions of a User Control Based on Parameters
要回答您的第二个问题,要在运行时为用户控制变量设置缓存持续时间,您可以通过两种方式完成:
在后面的用户控制代码中赋值:
[PartialCaching(60, null, "UC_WebUserControl.BothParams", null, true)]
public partial class WebUserControl1 : System.Web.UI.UserControl
{
...
protected void Page_Load(object sender, EventArgs e)
{
this.CachePolicy.Duration = new TimeSpan(0, 0, 60);
}
}
您可以在使用用户控件的 ID 引用用户控件的页面后面的代码中分配它。
例如,如果 aspx 上的用户控件是:
<mycontrols:control1 ID="ucControl1" runat="server" param1="15" param2="20" />
然后在aspx后面的代码中,你应该写:
this.ucControl1.CachePolicy.Duration = new TimeSpan(0, 0, 60);
仅供参考,如果用户控件和页面都被缓存:如果页面输出缓存持续时间小于用户控件的持续时间,则用户控件将被缓存直到其持续时间到期,即使在页面的其余部分重新生成一段时间后也是如此要求。例如,如果页面输出缓存设置为 50 秒,而用户控件的输出缓存设置为 100 秒,则用户控件每过期两次,页面其余部分过期。