6

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

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

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

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

那么这是如何实现的呢?这只是解析器遵循的约定吗?

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

4

1 回答 1

8

这是 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.aspxFoobar

于 2011-06-09T10:16:56.290 回答