2009-06-09 30 views
3

這僅用於更好地理解ASP.NET框架。當您在聲明的方式使用控制(這將是網頁形式的標記),您可以通過他們的方法名稱中使用與On開頭的屬性分配的事件處理程序:ASP.NET控件上的事件處理程序屬性的屬性如何具有前綴(用於Load事件處理程序的OnLoad)

<asp:Button runat="server" OnClick="..."/> 

但是當你看的System.Web .UI.WebControls.Button類它有一個事件處理程序屬性命名Click的委託分配給:

button.Click += new EventHandler(...); 

那麼這是怎麼實現的?這只是解析器之後的慣例嗎?

我知道,這是一個奇怪的問題,答案只會滿足我的好奇心。

回答

5

這是一個ASP.NET使用的命名約定,它看起來與.NET中廣泛使用的另一個通用命名約定看起來相同。儘管有明顯的相似性,但這兩個約定是無關的。

在此範圍內,.NET範圍的約定事實證明是無關緊要的,事件通常具有相應的方法來引發事件,並且這些方法的名稱可以通過將On前綴添加到事件名稱。例如,由Button提供的Click事件與提出該事件的OnClick方法有關(如在此處另一個答案中已經指出的那樣)。

混亂的部分是,有什麼做的OnClick屬性這個問題的關注OnClick方法。

通過編寫一個沒有任何這種方法的控件,很容易證明OnSomeEvent方法在這裏是不相關的。下面是一個簡單的用戶控件代碼隱藏:

public partial class EventWithoutMethod : System.Web.UI.UserControl 
{ 
    public event EventHandler Foobar; 

    protected void Page_Load(object sender, EventArgs e) 
    { 
    } 

    protected void Button1_Click(object sender, EventArgs e) 
    { 
     if (Foobar != null) 
     { 
      Foobar(this, EventArgs.Empty); 
     } 
    } 
} 

聲明一個Foobar事件。 (它從來沒有真正提出它,但這對探索的目的無關緊要。)它確實是而不是定義了一個OnFoobar方法。不過,ASP.NET是完全爲我們感到高興,當我們使用控制使用OnSomeEvent約定:

<user:EventWithoutMethod runat="server" OnFoobar="FooHandler" /> 

事實上,這不僅爲我們感到高興做到這一點,它實際上需要它。即使我的控件沒有定義任何名爲OnFoobar的成員 - 事件被稱爲Foobar - 如果我想從我的.aspx文件中附加事件處理函數,我必須編寫OnFoobar。如果我只是在其中添加Foobar屬性以嘗試附加事件,則處理程序將永遠不會運行。 (不幸的是,當你這樣做時,ASP.NET不會產生錯誤,它只是默默無聞地對屬性做任何事情,並且事件處理程序從不運行。)