这只是为了更好地理解ASP.NET框架。当您以声明方式使用控件(即Web表单标记)时,您可以使用以On
开头的属性通过其方法名称分配事件处理程序:
<asp:Button runat="server" OnClick="..."/>
但是当您查看System.Web.UI.WebControls.Button类时,它有一个名为Click
的EventHandler属性,该委托被分配给:
button.Click += new EventHandler(...);
那么这是如何实现的?这只是解析器后面的约定吗?
我知道,这是一个奇怪的问题,答案只会满足我的好奇心。
答案 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在您执行此操作时不会生成错误,它只是默默地无法对该属性执行任何操作,并且事件处理程序永远不会运行。)