订阅事件处理程序

时间:2010-03-26 14:56:34

标签: asp.net events event-handling

我对订阅事件处理程序时的优缺点感到好奇。

<asp:DropDownList id="DropDownList1" runat="server" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged" />

VS

protected void Page_Init(object sender, EventArgs e)
{
    this.DropDownList1.SelectedIndexChanged += new EventHandler(DropDownList1_SelectedIndexChanged);
}

2 个答案:

答案 0 :(得分:2)

从技术角度来看,两者之间没有太大的差异,所以这是编码风格和个人喜好的问题。您可以考虑以下几点:

  • 使用ASP.NET标记的声明性方法通常更短,并且您不需要执行所有初始化的大型方法
  • 如果您在代码隐藏中初始化处理程序,则不会污染声明性标记,其方面仅与代码隐藏相关(尽管我不认为这是一个大问题)

在某些情况下,您可以在代码隐藏中很好地使用C#lambda表达式等功能:​​

protected void Page_Init(object sender, EventArgs e) { 
   this.btnNext += (s1, e1) => MovePage(this.CurrentPage + 1);
   this.btnPrev += (s2, e2) => MovePage(this.CurrentPage - 1);
   // ...
}

这样的事情可以减少你需要编写的单一用途事件处理方法的数量,这应该使代码隐藏更简单。

但是,我认为简单ASP.NET应用程序的一般建议是使用声明性事件处理程序绑定,除非您有充分的理由不这样做(例如,如上例所示)。

答案 1 :(得分:2)

一个区别在于编译时检查。如果您使用声明性方法,并且由于某种原因您更改了处理程序方法名称或签名,则在ASP.NET运行时处理页面之前您将无法知道它。如果在代码隐藏中使用显式绑定,那么您将获得编译时检查。更稳定一点。

此外,有些人可能会认为将事件处理程序置于标记中会与关注点分离规则相矛盾。虽然使用ASP.NET Web表单,但与MVC框架中的谨慎分离不同,仍然存在一些交叉。