2009-05-19 14 views
11

ユーザーコントロールの基本クラスでPartialCaching属性を使用しています。ASP.NETで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" /> 

ただし、2つの別々のページに2つのコントロールインスタンスがある場合、と同じ param1とparam2のプロパティは、キャッシュされたコントロールが共有されるように、それらを1つのオブジェクトとしてキャッシュしたいと思います。

上記のユースケースはPartialCaching属性で実現できますか?どのような設定を使用しますか? varyByControl?

また、実行時にキャッシュ期間を可変にすることは可能ですか?

ありがとうございました。

答えて

22

あなたの最初のQに答えるには、まず自分の質問に答えがあることを教えてください。 '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によって指定され、実行時にユーザーコントロール変数のキャッシュ期間を作るために、あなたは二つの方法でそれを行うことができ、あなたの第二Qに答えるために、リンク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); 
        }  
    }
  2. あなたはユーザーコントロールは、ユーザーコントロールのIDを使用して参照されるページの背後にあるコードでそれを割り当てることができます。

ASPXのユーザーコントロールがある場合:

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

その後、ASPXの背後にあるコードでは、次のように記述する必要があります

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

、ユーザーコントロールとページの両方がキャッシュされている場合:ページの場合出力キャッシュの持続時間がユーザーコントロールのキャッシュ時間よりも短い場合、要求のためにページの残りの部分が再生成された後であっても、ユーザーコントロールは期間が満了するまでキャッシュされます。たとえば、ページ出力キャッシングが50秒に設定され、ユーザーコントロールの出力キャッシングが100秒に設定されている場合、残りのページの有効期限が切れる2回ごとにユーザーコントロールが1回期限切れになります。

+0

Response.Cacheは、ページレベルのキャッシュ用です。 PartialCaching属性を使用したコントロールレベルのキャッシュに興味があります。 – frankadelic

+0

ポイントを取得しました...私はそれに応じて応答を編集しました:) –

+0

また、あなたの例[PartialCaching(60、 "param1"、null、null、true)] ...これは "param1" QueryStringまたはPOSTパラメータ。それは私が望むものではありません。 "キャッシュされたコントロールは、コントロールインスタンスに設定されたプロパティに基づいて変化します。" – frankadelic

1

私はこの非常に古い質問に新しい答えを投稿しています。これは、受け入れられた答えがひどく不正確であるためです。 この正解は次のとおりです。

  • コントロールプロパティの値によって変化する組み込みの方法はありません。 VaryByControlはコントロールに対してのみ機能します。
  • キャッシュされたバージョンが提供されると、コントロールフィールドはnullになります。コード内のキャッシュ期間を変更することはできません.NullReferenceExceptionが発生します。
  • VaryByControlが任意の値に設定されている場合、コントロールIDとNamingContainer IDによってキャッシュが異なるバグがあります。それが時々働くように見える理由です。このバグはここにあります:http://referencesource.microsoft.com/#System.Web/xsp/system/Web/UI/PartialCachingControl.cs#530

私はこのほど、最近ここにブログを書いています:http://tabeokatech.blogspot.be/2014/09/outputcache-on-user-controls.html

// PhControls is an asp:PlaceHolder 
    protected void Page_Init(object sender, EventArgs e) 
    { 
     for (int i = 0; i < 3; i++) 
     { 
      System.Web.UI.StaticPartialCachingControl.BuildCachedControl(PhControls, String.Format("Test{0}", i), String.Format("1234567{0}", i), 180, null, null, null, null, new System.Web.UI.BuildMethod(GetBuilderDelegate(i)), null); 
     } 
    } 

    public Func<Control> GetBuilderDelegate(int number) 
    { 
     return delegate() 
     { 
      var control = (UserControls.Test)LoadControl("~/UserControls/Test.ascx"); 
      control.Number = number; 
      return control; 
     }; 
    } 

きちんと取る:あなたはこの作品を作ることができる

の方法は、コードビハインドでPartialCachingControlのために自分自身をビルダーメソッドを呼び出して、GUIDパラメータでであなたが変化するようにしたいプロパティ値を埋め込むですコードビハインドでキャッシングの持続時間を変更する必要もあります。あなたがこれを行うときにascxでマークアップからOutputCacheディレクティブを削除することを確認してください。それ以外の場合、LoadControlは別のPartialCachingControlを取得し、キャストは失敗します。

関連する問題