【问题标题】:What is the best way of subscribing to events in ASP.NET?在 ASP.NET 中订阅事件的最佳方式是什么?
【发布时间】:2009-09-26 01:40:08
【问题描述】:

我已经完成了一些reading on SO,但没有找到我的问题的答案。

正如@Canavar 指出的in his answer 有两种订阅事件的方法:

声明性:

<asp:Button runat="server" ID="myButton" OnClick="myButton_Click" />  

代码背后:

myButton.Click += new EventHandler(myButton_Click);

我以声明方式订阅事件,但很少在默认事件处理程序中使用“发送者”和 EventArgs。大多数时候,我最终都会从事件处理程序中调用一个方法。

使用委托订阅事件会更好吗?

myButton.Click += delegate{DoStuff();};

如果我把事情复杂化了,请告诉我,应该坚持声明式事件订阅,并从默认事件处理程序调用我的 DoStuff() 方法。

【问题讨论】:

    标签: asp.net events event-handling


    【解决方案1】:

    您的处理程序需要匹配事件的指定参数。如果您使用委托,您将只是定义相同的东西。丢弃这些参数似乎是一种浪费,因为您将来可能出于某种原因需要它们。我想不出任何不想要参数的充分理由。

    事件处理程序已经是委托了:)

    【讨论】:

    • 就是这样 - 参数不必匹配。 myButton.Click += 委托{DoStuff();};工作得很好
    • 有趣我不知道。但无论哪种方式,除了丢弃信息(由参数提供)之外,您不会通过匿名代表获得任何收益,这可能会在以后需要。我看不出有什么好处。
    【解决方案2】:

    我个人尽可能使用声明式方法。虽然声明式和命令式方法都没有真正比另一个“更好”,但两者都有其优点。在大多数情况下,使用声明性方法意味着您在页面行为和页面内容之间有更大的解耦和更大的灵活性。如果您出于某种原因需要更改页面内容,则使用声明性方法可以为您提供更多的余地,而无需重新编译。

    这并不意味着命令式方法毫无用处。有时无法以声明方式应用处理程序。即动态场景。命令式方法允许您使用代码来创建动态内容并仍然连接事件。使用最适合场景的东西。没有一种合适的方法,两者都有自己的利基。

    【讨论】:

      【解决方案3】:

      我最喜欢的:

      myButton.Click += myButton_Click;
      

      实际上并不需要 EventHandler。另外,如果你是 C# 3.0,你可以在上面使用 lambda:

      myButton.Click += (x,a)=>DoStuff();  // something like that.
      

      但实际上,不必担心太多。

      【讨论】: