1

キャッシング、特にコントロールを使用した部分キャッシングについて学ぼうとしています。

私のウェブサイトは特定のページで動作が遅いため、できるだけ多くのキャッシュが役立ちます.

SO で見つけたコードやその他のさまざまな Google の結果から多くの実験を実行したところ、動的に追加されたコントロールで問題が発生しています。

このコードを含む簡単なページをセットアップしました。

<%@ Page Language="VB" Debug="true" %>
<%@ Register TagPrefix="controls" TagName="control" Src="~/test/control.ascx" %> 

<script runat="server">          
   Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load

       Label2.Text = "Present Time: "
       Label2.Text += DateTime.Now.ToString()

   End Sub    
</script>
<html>
<body>
   <form id="form1" runat="server">
    <div>
        <h2 style="color:Red">Output Caching</h2>
        <asp:Label ID="Label2" runat="server"></asp:Label>        
        <controls:control ID='control1' runat='server' /> 
        '------------------------------------------
        <hr />
        <div id='dyn2' runat='server' />   
    </div>
    </form>
</body>
</html>

コントロールcontrol.ascxは次のようになります。

<%@ Control Language="VB" ClassName="control" %>
<%@ OutputCache Duration="60" VaryByParam="r" %>
<script runat="server">
    Sub Page_Load() Handles Me.Load
        controlContent.InnerHtml = "Control time: " & DateTime.Now.ToString()
    End Sub
</script>
<div id="controlContent" runat="server"></div>

これはうまく機能し、ページに「ライブ」時間を提供しますが、キャッシュされたコントロールには、OutputCache宣言に従って60秒が経過した後にのみ更新される時間が表示されます。

<controls>ページの一部をキャッシュする必要があり、その部分がタグを使用してページに明示的に入力されている場合に、これを任意のアプリケーションに使用する方法を確認できます。このvaryByParamオプションは私にとっても便利です。(まだ調べてませんvaryByCustom!)

ただし、場合によっては、特定のニーズに基づいてプログラムでコントロールをページにロードしています。

この場合、次のようなコードを使用します。

Dim theResult As test_control2 = CType(LoadControl("~\test\control2.ascx"), test_control2)
dyn2.Controls.Add(theResult)

これは、 「dyn2」control2.ascxで divに想像力を働かせる 2 番目のテスト コントロールをプログラムで追加しています。id

コントロールにキャッシュ ディレクティブ ヘッダーがない場合、またはコード ビハインドの場合、すべて正常に動作しますが、(ページ全体をキャッシュしない限り) キャッシュできません。

ただし、上記の制御コードに従ってキャッシュ ヘッダーを追加すると、次のエラーが発生します。

Unable to cast object of type 'System.Web.UI.PartialCachingControl' to type 'test_control2'.

グーグルはこれであまり役に立たないようで、PartialCachingControl型を調査するとさらに問題が発生します!

これらのコントロールをキャッシュできるようにするために何をすべきか教えてもらえますか?

問題があれば、私は VB.net でコーディングしており、.NET 2.0 も使用しているため、該当する場合は、このプラットフォームの制限に関するアドバイスもいただければ幸いです。

4

1 に答える 1

0

あはは!最後に、SOに関する別の質問が見つかりました

プロパティの値を指定して、VaryByControl OutputCache を使用するコントロールを LoadControl する方法

基本的に、コントロールの変更をロードするときに間違ったタイプを使用していました:

Dim theResult As test_control2 = CType(LoadControl("~\test\control2.ascx"), test_control2)
dyn2.Controls.Add(theResult)

Dim theResult As PartialCachingControl = DirectCast(LoadControl("~\test\control2.ascx"), PartialCachingControl)
dyn2.Controls.Add(theResult)

並べた!

于 2012-08-27T15:29:20.900 に答える