Я бы хотел перехватить OnInit
из (многочисленных) элементов управления на странице. Цель состоит в том, чтобы установить различные свойства элементов управления во время выполнения. Крайне важно, чтобы перехват произошел до начала ViewState
отслеживания для элемента управления, потому что рассматриваемые значения свойств не должны храниться в ViewState
(для экономии места).
Существует много простых методов установки свойств во время выполнения, но они не соответствуют моим потребностям, поскольку они происходят после ViewState
отслеживания для запуска Control
. (Примером одного такого метода является циклический просмотр элементов управления в дереве элементов управления Page
во время метода Page
OnInit
. Это слишком поздно, так как отслеживание ViewState
уже началось на элементах управления, так как они были добавлены в дерево.)
Я подошел к идеальному решению. Я поместил в файл .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
в Page
для всех элементов управления в разметке является чрезмерным и требует более общего решения.