为什么ASP.NET控件上的事件处理程序属性的属性有一个前缀(Load事件处理程序的OnLoad)

时间:2009-06-09 09:44:42

标签: asp.net aspnet-compiler

这只是为了更好地理解ASP.NET框架。当您以声明方式使用控件(即Web表单标记)时,您可以使用以On开头的属性通过其方法名称分配事件处理程序:

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

但是当您查看System.Web.UI.WebControls.Button类时,它有一个名为Click的EventHandler属性,该委托被分配给:

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

那么这是如何实现的?这只是解析器后面的约定吗?

我知道,这是一个奇怪的问题,答案只会满足我的好奇心。

1 个答案:

答案 0 :(得分:5)

这是ASP.NET使用的命名约定,它非常无用,看起来与.NET中广泛使用的另一种常见命名约定相同。尽管有明显的相似性,但这两个惯例是无关的。

.NET范围的约定在这里变得无关紧要,事件通常会有相应的方法引发事件,并且通过添加On来形成这些方法的名称事件名称的前缀。例如,Click提供的Button事件与OnClick方法相关,该方法会引发该事件(正如此处的另一个答案中所述)。

令人困惑的部分是OnClick 方法与<{1}} 属性 问题关注点。

通过编写没有任何此类方法的控件,可以很容易地证明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方法。然而,当我们使用控件时,ASP.NET非常高兴我们使用OnFoobar约定:

OnSomeEvent

事实上,我们不仅对此感到高兴,实际上需要它。即使我的控件没有定义任何名为<user:EventWithoutMethod runat="server" OnFoobar="FooHandler" /> 的成员 - 该事件仅被调用OnFoobar - 如果我想从{{1}附加事件处理程序,我必须编写Foobar文件。如果我只是在其中放置OnFoobar属性以尝试附加事件,则处理程序将永远不会运行。 (无益的是,ASP.NET在您执行此操作时不会生成错误,它只是默默地无法对该属性执行任何操作,并且事件处理程序永远不会运行。)