2009-06-09 1 views
3

これはASP.NETフレームワークをよりよく理解するためのものです。あなたは(つまり、Webフォームのマークアップになります)宣言的な方法でコントロールを使用するときは、Onで始まる属性を使用してメソッド名でイベントハンドラを割り当てます。ASP.NETコントロールのイベントハンドラプロパティの属性に接頭辞(LoadイベントハンドラのOnLoad)があるとどうなりますか

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

しかし、あなたは、System.Webのを見たとき

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

だから、これはどのように実装されます?それはEventHandlerのプロパティは、デリゲートが割り当てられている.UI.WebControls.ButtonクラスClick名付けましたかパーサに続くコンベンションですか?

私は知っている、それは奇妙な質問ですが、答えは何もしませんが、私の好奇心を満たすでしょう。

答えて

5

これはASP.NETで使用されている命名規則で、むしろ面倒なことに、.NET全体で広く使用されている別の一般的な命名規則と同じに見えます。明らかな類似性にもかかわらず、これらの2つの規則は無関係です。

ここでは無関係なイベントは、イベントに対応するメソッドを持つことが一般的であり、これらのメソッドの名前は、イベント名。たとえば、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はそれを行うときにエラーを生成しません。静かに属性で何も実行できず、イベントハンドラは実行されません)

関連する問題