拦截ASP.NET控件OnInit

时间:2009-08-28 01:35:06

标签: asp.net events controls

我想截取页面上OnInit个(众多)控件。目的是在运行时设置控件的各种属性。截取在ViewState跟踪控件之前发生是至关重要的,因为有问题的属性值不会存储在ViewState中(以节省空间)。

有许多简单的技术可以在运行时设置属性,但它们无法满足我的需求,因为它们是在ViewState跟踪Control启动后发生的。 (一种这样的技术的一个例子是在Page的{​​{1}}方法中循环遍历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事件处理程序,并且需要更通用的解决方案。

1 个答案:

答案 0 :(得分:0)

稍微超过你的追求,但也许PostSharp对你来说会很有趣。你可以用它来挂钩这个事件。