我想拦截
OnInit
页面上的(多个)控件。其目的是在运行时设置控件的各种属性。截获发生在
ViewState
跟踪控件,因为所讨论的属性值不会存储在
对象
(为了节省空间)。
有许多简单的技术可以在运行时设置属性,但它们不能满足我的需要,因为它们发生在
对象
跟踪
Control
开始。(这种技术的一个例子是在
Page
的控制树
页
的
奥尼特
方法。太晚了,因为
对象
控件添加到树中时,已开始跟踪。)
我几乎找到了一个完美的解决方案。我在一个
.browser
文件:
<browsers>
<browser refID="Default">
<controlAdapters>
<adapter controlType="System.Web.UI.WebControls.WebControl" adapterType="TestClassLibrary.TestWebControlAdapter, TestClassLibrary"/>
</controlAdapters>
</browser>
</browsers>
以下是的源代码
TestWebControlAdapter
:
using System;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.Adapters;
namespace TestClassLibrary
{
public class TestWebControlAdapter : WebControlAdapter
{
protected override void OnInit(EventArgs e)
{
if (this.Control is Button)
{
((Button)this.Control).Text = "Test Adapter";
}
base.OnInit(e);
}
}
}
我看到的问题是适配器无法堆叠,因此这将覆盖可能应用于此控件的任何其他适配器。
有什么更好的办法来解决这个问题吗?注意,虽然它可以工作,但我考虑实际上添加一个
Init
中的事件处理程序
页
使标记中的所有控件都过多,并需要更通用的解决方案。