Asp.net

使用 ASP.NET 中的 PartialCaching 因控制項屬性而異

  • September 12, 2014

我在使用者控制項的基類上使用 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

要回答您的第二個問題,要在執行時為使用者控制變數設置記憶體持續時間,您可以通過兩種方式完成:

  1. 在後面的使用者控制程式碼中賦值:
[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);
   }    
}
  1. 您可以在使用使用者控制項的 ID 引用使用者控制項的頁面後面的程式碼中分配它。

例如,如果 aspx 上的使用者控制項是:

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

然後在aspx後面的程式碼中,你應該寫:

this.ucControl1.CachePolicy.Duration = new TimeSpan(0, 0, 60);

僅供參考,如果使用者控制項和頁面都被記憶體:如果頁面輸出記憶體持續時間小於使用者控制項的持續時間,則使用者控制項將被記憶體直到其持續時間到期,即使在頁面的其餘部分重新生成一段時間後也是如此要求。例如,如果頁面輸出記憶體設置為 50 秒,而使用者控制項的輸出記憶體設置為 100 秒,則使用者控制項每過期兩次,頁面其餘部分過期。

引用自:https://stackoverflow.com/questions/880937