在ASP.NET中使用PartialCaching控件属性变化

我在用户控件的基类上使用PartialCaching属性.

我希望缓存的控件根据控件实例上设置的属性而有所不同.

例如:

<mycontrols:control1 runat="server" param1="10" param2="20" />

…输出将与具有不同属性的控件实例分开缓存:

<mycontrols:control1 runat="server" param1="15" param2="20" />

…并且这个控件也将被单独缓存:

<mycontrols:control1 runat="server" param1="10" param2="25" />

但是,如果两个独立页面上的两个控件实例具有相同的param1和param2属性,我希望它们将其缓存为一个对象(以便缓存控件将被共享).

可以使用PartialCaching属性来实现上述用例吗?我会使用什么设置? varyByControl?

此外,是否可以在运行时使缓存持续时间变量?

谢谢.

要回答你的第一个问题,让我先告诉你,你的问题本身有答案;). ‘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);

FYI,如果用户控件和页面都被缓存:如果页面输出缓存持续时间小于用户控件的页面输出缓存持续时间,则用户控件将被缓存,直到其持续时间过期,即使页面的其余部分被重新生成请求.例如,如果页面输出缓存设置为50秒,并且用户控件的输出缓存设置为100秒,则用户控件将在页面其余部分到期的两两次过期.

翻译自:https://stackoverflow.com/questions/880937/vary-by-control-properties-using-partialcaching-in-asp-net

转载注明原文:在ASP.NET中使用PartialCaching控件属性变化