2009-08-28 30 views
1

我想拦截页面上(众多)控件的OnInit。目的是在运行时设置控件的各种属性。在ViewState开始跟踪控制之前进行截取非常重要,因为所讨论的属性值不会存储在ViewState(以节省空间)中。截取ASP.NET控件OnInit

在运行时有很多简单的技术来设置属性,但它们不符合我的需求,因为它们是在ViewState追踪Control开始后发生的。 (在PageOnInit方法期间,Page的控制树中的控件循环通过Page的控制树中的控件,这是一个例子,这是因为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); 
     } 
    } 
} 

,我这个看到的问题是,适配器不能堆放,因此这将覆盖任何其他适用于此控件的适配器。

关于更好的方法来解决这个问题的任何想法?请注意,虽然它可以工作,但我认为实际上在Page中为标记中的所有控件添加了一个Init事件处理程序,并且需要更通用的解决方案。

回答

0

稍微比你以后,但也许PostSharp会对你有趣。你可能会用它钩住这个事件。

+0

我需要能够拦截内置控件上的OnInit,而不仅仅是我拥有源代码的控件。所以我不认为这会对我有很大的帮助。 – 2009-08-28 02:00:02