拦截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);
}
}
}