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>

这很好用,并在页面中为我提供了一个“实时”时间,而缓存控件向我显示了一个仅在 60 秒后更新的时间,根据OutputCache声明。

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

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

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

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

这是以编程方式添加我的第二个测试控件,富有想象力地使用“dyn2”将其命名control2.ascx为 div 。id

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

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

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 的控件,指定属性值

基本上,我在加载控件更改时使用了错误的类型:

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 回答