asp.net - 在 ASP.NET 中使用 PartialCaching 因控件属性而异

标签 asp.net caching outputcache

我在用户控件的基类上使用 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 属性可以实现上述用例吗?我会使用哪些设置?变化控制?

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

谢谢。

最佳答案

要回答你的第一个问题,让我先告诉你,你的问题本身就有答案;)。 '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 秒,则用户控件每两次过期页面其余部分过期一次。

    关于asp.net - 在 ASP.NET 中使用 PartialCaching 因控件属性而异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/880937/

    相关文章:

    c# - 如何将 C# 6 与网站项目类型一起使用?

    java - infinispan:集群实例不共享缓存

    asp.net - 将 OutputCache 添加到 ASP.NET WebForm 会使我的站点崩溃 :(

    javascript - 如何确保永远不会缓存动态生成的 javascript 文件?

    c# - 如何检查输入 IP 是否属于特定 IP 范围

    asp.net - 使面板在 asp.net 中可见或不可见

    缓存 bigquery 查询

    java - Apache Ignite - java.lang.ClassNotFoundException : Unknown pair

    asp.net - 如果页面出现异常,则使输出缓存无效

    c# - 获取 JSON 对象节点