缓存动态/以编程方式添加的用户控件

时间:2012-08-19 18:28:26

标签: asp.net caching outputcache cache-control

我正在尝试了解缓存,特别是使用控件进行部分缓存。

我的网站在某些网页上运行缓慢,因此尽可能缓存会有所帮助。

从我在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>

这很有效,并且在页面中给了我一个“实时”时间,而缓存的控件显示了一个时间,该时间仅在60秒后更新,符合OutputCache声明。

当我需要缓存页面的一部分并且该部分明确地输入到带有<controls>标记的页面时,我可以看到如何将其用于任何应用程序。 varyByParam选项对我也很有用。 (我还没有调查varyByCustom!)

但是,在某些情况下,我会根据特定需求以编程方式将控件加载到页面中。

在这种情况下,我使用这样的代码:

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

这是以编程方式将我的第二个测试控件添加到具有control2.ascx“dyn2”的div中,富有想象力的id

控件中没有缓存指令头,或者代码隐藏,l一切正常,但我无法缓存它(除非我缓存整个页面)。

但是,如果按照上面的控制代码添加缓存头,我会收到此错误:

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

谷歌搜索似乎对我没有多大帮助,调查PartialCachingControl类型会让我陷入更多问题!

有人可以告诉我应该做些什么来让我能够缓存这些控件吗?

如果重要,我在VB.net编写代码并使用.NET 2.0,因此如果适用的话,任何关于此平台限制的建议也会受到赞赏。

1 个答案:

答案 0 :(得分:0)

啊哈哈!终于找到了另一个有关SO的问题

How to LoadControl a control that uses VaryByControl OutputCache, specifying values for properties

基本上,我在加载控件changin时使用了错误的Type:

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)

对它进行排序!