拦截ASP.NET控件OnInit

拦截ASP.NET控件OnInit,asp.net,events,controls,Asp.net,Events,Controls,我想截取页面上(许多)控件的OnInit。目的是在运行时设置控件的各种属性。拦截必须在控件的ViewState跟踪开始之前进行,因为相关属性值不存储在ViewState中(以节省空间) 有许多简单的技术可以在运行时设置属性,但它们不能满足我的需要,因为它们发生在ViewState跟踪控件启动之后。(此类技术的一个示例是在页面的OnInit方法期间在页面的控件树中循环。这已经太晚了,因为添加到树中的控件已开始跟踪视图状态 我几乎找到了一个完美的解决方案。我将以下内容放入.browser文件中: &

我想截取页面上(许多)控件的
OnInit
。目的是在运行时设置控件的各种属性。拦截必须在控件的
ViewState
跟踪开始之前进行,因为相关属性值不存储在
ViewState
中(以节省空间)

有许多简单的技术可以在运行时设置属性,但它们不能满足我的需要,因为它们发生在
ViewState
跟踪
控件启动之后。(此类技术的一个示例是在
页面
OnInit
方法期间在
页面
的控件树中循环。这已经太晚了,因为添加到树中的控件已开始跟踪
视图状态

我几乎找到了一个完美的解决方案。我将以下内容放入
.browser
文件中:

<browsers>
    <browser refID="Default">
        <controlAdapters>
            <adapter controlType="System.Web.UI.WebControls.WebControl" adapterType="TestClassLibrary.TestWebControlAdapter, TestClassLibrary"/>
        </controlAdapters>
    </browser>
</browsers>
我看到的问题是适配器无法堆叠,因此这将覆盖可能应用于此控件的任何其他适配器


有没有更好的办法来解决这个问题?请注意,虽然它会起作用,但我认为实际上在代码< >代码>页> <代码>中,对于标记中的所有控件都添加了<<代码> init <代码>事件处理程序,并且需要一个更一般的解决方案。

比您稍稍多,但可能对您来说很有意思。您可能会使用它来钩住此事件。

我需要能够在机箱内控件上拦截OnInit,而不仅仅是我有源代码的控件。所以我觉得这对我没什么帮助。
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);
        }
    }
}