这是 ASP.NET 使用的一种命名约定,但它看起来与整个 .NET 中广泛使用的另一种常见命名约定完全相同。尽管有明显的相似之处,但这两个约定是不相关的。
.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
.aspx
Foobar