キャッシュを使用する必要があるユーザーコントロールがありますVaryByControl
。ファイルは次の.ascx
ようになります:
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="TestControl.ascx.cs" Inherits="mynamespace.TestControl" %>
<%@ OutputCache Duration="10" Shared="true" VaryByControl="Test" %>
<p id="SomeText" runat="server">Nothing</p>
コードビハインドファイルのTestControl
クラスには、段落を次のように埋めるint Test {...}
プロパティとイベントハンドラーがあります。Page_Load()
SomeText
SomeText.InnerText = string.Format(@"Test={0} at {1}", Test, DateTime.Now)
次のようなファイルがあり.aspx
ます。
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="TestPage.aspx.cs" Inherits="mynamespace.TestPage" %>
<%@ Register TagPrefix="xxx" TagName="TestControl" Src="Controls\TestControl.ascx" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<xxx:TestControl Test="6" runat="server" />
<xxx:TestControl Test="7" runat="server" />
<hr />
<asp:PlaceHolder ID="Suport" runat="server" />
</body>
</html>
2つの<xxx:TestControl>
タグは、期待値に設定されたのインスタンスを適切にロードTestControl
しますTest
。ブラウザーを数回更新でき、キャッシュが適切に機能していることを確認できます。
ここで、さまざまな値を使用して<asp:PlaceHolder ID="Suport" />
、のいくつかのインスタンスで埋めたいと思います。これらはすべて、適切なキャッシュの恩恵を受けるはずです。メソッドを使用しようとしていますが、プロパティの値を指定する方法が見つかりません。ページをロードするすべてのコードが適切なキャッシュされたコントロールを見つけることができた後、そのようなメソッドが存在することを期待しています。私が取得するのは、初期化されていないのインスタンスであり、実行時にレンダリングされたショーのデフォルト値はです。TestControl
Test
LoadControl
Test
asp.net
.aspx
PartialCachingControl
CachedControl
TestControl
Test
0
これは私の.aspx
Page_Load()
イベントハンドラーがどのように見えるかです:
protected void Page_Load(object sender, EventArgs e)
{
PartialCachingControl tc = (PartialCachingControl) LoadControl(@"Controls\TestControl.ascx");
if (tc.CachedControl != null)
((TestControl)tc.CachedControl).Test = 67;
Suport.Controls.Add(tc);
}
編集
ページ全体をキャッシュすることで問題を回避することはできますが、この方法でそれを行う方法が見つからないのは奇妙に思えます。特に、ASPXファイルを介してコントロールを呼び出すと期待どおりに機能するため(方法があることを証明します)。
編集2
うーん、今のところ答えはありません。私は賞金を始めました、うまくいけばそれはもう少し注目を集めるでしょう。