I would like to intercept the OnInit of (numerous) controls on a page. The purpose is to set various properties of the controls at run time. It is critical that the interception happens prior to the start of ViewState tracking for the control because the property values in question are not to be stored in the ViewState (to conserve space).
There are many simple techniques to set properties at run time, but they do not meet my needs because they happen after ViewState tracking for the Control starts. (An example of one such technique is looping through the controls in the Page's control tree during the Page's OnInit method. This is too late as ViewState tracking has already started on the controls as they were added to the tree.)
I came close to a perfect solution. I put the following in a .browser file:
<browsers>
<browser refID="Default">
<controlAdapters>
<adapter controlType="System.Web.UI.WebControls.WebControl" adapterType="TestClassLibrary.TestWebControlAdapter, TestClassLibrary"/>
</controlAdapters>
</browser>
</browsers>
The following is the source code for 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);
}
}
}
The problem that I see with this is that adapters cannot be stacked, so this would override any other adapter that might otherwise apply to this control.
Any ideas on better ways to solve this problem? Note that, while it would work, I consider actually adding an Init event handler in the Page for all of the controls in the markup to be excessive and want a more general solution.