我正在尝试了解缓存,特别是使用控件进行部分缓存。
我的网站在某些网页上运行缓慢,因此尽可能缓存会有所帮助。
从我在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,因此如果适用的话,任何关于此平台限制的建议也会受到赞赏。
答案 0 :(得分:0)
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)
对它进行排序!