6

これは、ASP.NET フレームワークをよりよく理解するためのものです。宣言的な方法 (Web フォーム マークアップ) でコントロールを使用する場合、次の属性を使用してメソッド名でイベント ハンドラーを割り当てますOn

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

しかし、System.Web.UI.WebControls.Button クラスを見るとClick、デリゲートが割り当てられているという名前の EventHandler プロパティがあります。

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

では、これはどのように実装されていますか?それはパーサーが従う単なる規則ですか?

奇妙な質問だとは思いますが、答えは私の好奇心を満足させるだけです。

4

1 に答える 1

8

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

ここでは無関係であることが判明した.NET全体の規則では、イベントには、イベントを発生させる対応するメソッドがあり、それらのメソッドの名前はOn、イベント名にプレフィックスを追加することによって形成されるのが一般的です。たとえば、Clickによって提供されるイベントは、そのイベントを発生させるメソッドにButton関連し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は、書き込む必要があります。イベントをアタッチするために属性をそこに配置しただけでは、ハンドラーは実行されません。(残念ながら、ASP.NETはそれを実行してもエラーを生成せず、属性に対して何も実行せず、イベントハンドラーは実行されません。)OnFoobar.aspxFoobar

于 2011-06-09T10:16:56.290 に答える