2009-08-28 27 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