gpt4 book ai didi

asp.net - 如何加载使用 VaryByControl OutputCache 的控件,并指定属性值

转载 作者:行者123 更新时间:2023-12-02 11:22:00 27 4
gpt4 key购买 nike

我有一个应该使用缓存的用户控件,其中 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 {...}属性(property)和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>

两个<xxx:TestControl>标签正确加载 TestControl 的实例与 Test设置为预期值,我可以刷新浏览器几次,并且可以看到缓存正确地完成了它的工作。

现在我想填写<asp:PlaceHolder ID="Suport" />TestControl 的一些实例,使用不同的 Test值,这都应该受益于适当的缓存。我正在尝试使用 LoadControl方法,但我找不到为 Test 指定值的方法属性(property)。毕竟我期望这样的方法存在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

嗯,到目前为止还没有答案。我开始悬赏,希望能得到更多关注。

最佳答案

要让控件参与整个页面生命周期,应将其添加到 Init 事件或 CreateChildControls 方法中,而不是添加到 Load 上。由于 VaryByControl 需要完全限定的控件标识符才能工作,因此必须在页面周期开始之前对其进行初始化。

与此类似的东西:

protected override void OnInit(EventArgs e) {
var testControl = LoadControl(@"TestControl.ascx");
testControl.ID = "TestControl";
Suport.Controls.Add(testControl);
base.OnInit(e);
}

protected override void OnLoad(EventArgs e) {
TestControl testControl = GetTestControl("TestControl");
if(testControl != null){ //If it is null it is cached and can not be changed
testControl.Test = 242;
}
base.OnLoad(e);
}

private TestControl GetTestControl(string name) {
var control = this.Suport.FindControl(name);
var partialCachedControl = control as PartialCachingControl;
if(partialCachedControl != null) {
control = partialCachedControl.CachedControl;
}
return control as TestControl;
}

由于输出是按控件缓存的,因此在清除缓存之前您无法更改控件。如果您想更改该值并重新生成内容,您必须清除缓存或创建一个新控件(使用新 ID)。清除缓存的一种方法是使用 VaryByCustom 来代替,并生成一个缓存键,如果您的测试值发生变化,该键也会发生变化。

还记得在测试控件上实现 INamingContainer 接口(interface),以避免不同对象之间的命名冲突。为此,只需将接口(interface)添加到控件中,如下所示:

public class TestControl: WebControl, INamingContainer {}

关于asp.net - 如何加载使用 VaryByControl OutputCache 的控件,并指定属性值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6574528/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com