12

ユーザー コントロールの基本クラスで 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 属性で実現できますか? どのような設定を使用しますか? 変化するコントロール?

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

ありがとう。

4

3 に答える 3

22

あなたの最初の質問に答えるために、あなたの質問自体に答えがあることを最初に伝えさせてください;)。'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 で指定されます。 リンクを参照してください。方法: パラメーターに基づいてユーザー コントロールの複数のバージョンをキャッシュする

2 番目の Q に答えるには、実行時にユーザー コントロール変数のキャッシュ期間を作成するには、次の 2 つの方法があります。

  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 のコード ビハインドで、次のように記述します。

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

参考までに、ユーザー コントロールとページの両方がキャッシュされている場合: ページ出力キャッシュ期間がユーザー コントロールの期間よりも短い場合、ページの残りの部分が再生成された後でも、期間が終了するまでユーザー コントロールはキャッシュされます。リクエスト。たとえば、ページの出力キャッシュが 50 秒に設定され、ユーザー コントロールの出力キャッシュが 100 秒に設定されている場合、ユーザー コントロールは、残りのページが期限切れになる 2 回ごとに 1 回期限切れになります。

于 2009-05-24T09:35:52.173 に答える
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 .

これを機能させる方法は、コード ビハインドで PartialCachingControl のビルダー メソッドを自分で呼び出し、変更するプロパティ値を guid パラメーターに埋め込むことです。

    // 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;
        };
    }

これにより、コード ビハインドでのさまざまなキャッシュ期間も適切に処理されます。ただし、これを行うときは、ascx のマークアップから OutputCache ディレクティブを必ず削除してください。それ以外の場合、LoadControl は別の PartialCachingControl を取得し、キャストは失敗します。

于 2014-09-12T19:35:59.190 に答える
1

必要なのは、 Declarative Attributes を使用してユーザー コントロールの複数のバージョンをキャッシュすることです。

于 2009-05-21T19:10:34.123 に答える