【问题标题】:Organizing Event Handlers Methods组织事件处理程序方法
【发布时间】:2011-07-13 05:28:30
【问题描述】:

我在 web 表单中使用 asp.net 和 c#。

使用 Visual Studio,它会自动为我的控件创建事件处理程序方法。 VS 以这种方式生成 Method 名称idControl_event。我知道我可以给事件处理程序方法起任何名字。

  • 所以我想知道您最喜欢的主题命名方法是什么。

  • 我想知道是否可以使用 Web 窗体在单独的类中编写事件处理程序方法(而不是在特定网页的代码中)以及如何从控件中调用主题。

感谢您的宝贵时间。

【问题讨论】:

  • 只是出于好奇,为什么要将事件处理程序与代码隐藏分开?
  • 我在“C# 2008 Objects”一书中读到了这种架构方法,它指的是一种可以在 Windows 应用程序中使用的模式。主要想法是在一个地方为许多控件提供通用逻辑......所以我很想看看是否可以应用于 Web 表单。
  • 嗯,这给了我另一个关于使用基类封装公共逻辑的想法 - 我已经更新了我的答案以包含该选项。

标签: c# asp.net delegates event-handling


【解决方案1】:

对于事件处理程序名称,我一般使用 Visual Studio 默认生成的格式:[idControl]_[eventName]。但这在很大程度上是个人/团队的偏好。我见过类似的讨论,例如this onethis one。无论您选择如何命名事件处理程序,我认为最重要的是保持一致。

至于将事件处理程序放在代码之外,我没有经常看到这样做,但这是可能的。最简单的方法是在具有公共事件处理逻辑的单独类中使用静态方法。例如,下面是如何在一个单独的类中为 Page.Loaded 提供标准逻辑。我相信您需要通过代码注册事件处理程序 - 我认为您无法在标记 (aspx) 中完成。

public static class CommonEventHandlers
{
    public static void Page_Loaded(object sender, EventArgs e)
    {
        //Do any standard logic

        //If you need a reference to the page that raised the event, 
        //   you can get it from the 'sender' parameter.
        Page page = (Page)sender;

        //Do something with 'page'
    }
}

然后在您要使用该公共事件处理程序的页面的代码隐藏中:

public partial class WebForm1 : System.Web.UI.Page
{
    public WebForm1()
    {
        //Register the handler via code in the constructor
        Load += CommonEventHandlers.Page_Loaded;
    }
}

作为另一种选择,您可以使用继承来帮助代码重用。例如,您可以有一个您的 Pages 继承自该基类的具有标准处理程序的基类。这样做的一个好处是即使方法在基类中声明,您也可以在标记中注册事件处理程序,因此您不需要在祖先页面的代码隐藏中做任何事情。

【讨论】:

  • OP 是否还需要将 AutoEventWireup 设置为 false 才能使用它?
  • @Tim - AutoEventWireup 不会影响这种方法。但是,如果您碰巧在页面中有一个名为Page_Load 的方法,而AutoEventWireuptrue,那么Page_Load 方法 中的CommonEventHandler 方法都会被调用。但我认为这是意料之中的 - 如果您想要一些标准处理(CommonEventHandlers)和自定义处理(Page_Load)发生,甚至可能需要。
  • 有趣。如果事件被触发的顺序总是已知的并且保证是相同的(即,代码隐藏然后是 CommonEventHandlers),这可能会导致一些有趣的设计可能性。虽然我仍然不确定那里不会有更好的方法。
  • 更多关于 AutoEventWireup 的解释可以在这里找到forums.asp.net/p/932513/1096656.aspx
  • 理论上,我不相信订单是有保证的。但实际上,事件处理程序是按照它们注册的顺序调用的(只是不要引用我的话)。因此,在上述情况下,将首先调用“CommonEventHandler”(它在构造函数中注册,这比 AutoEventWireup 发生时要早得多)。无论哪种方式,我都同意拥有多个依赖于特定顺序的事件处理程序是一个不好的迹象。
【解决方案2】:

我不认为你可以在另一个类中拥有事件处理程序,你能得到的最好的可能是在一个单独的部分类文件中

【讨论】:

    【解决方案3】:

    正如@Daniel Powell 所说,我很确定您可以对事件做的最好的事情就是将它们作为您的代码隐藏的部分类放在不同的文件中。

    关于命名约定,95% 的情况下,我都会看到像您所说的那样命名的事件 - idControl_event。这就是我命名它们的方式,因为当我查看源代码时,它可以很容易地将代码绑定到控件。

    【讨论】:

      猜你喜欢
      • 2013-10-24
      • 1970-01-01
      • 1970-01-01
      • 2016-09-06
      • 1970-01-01
      • 2012-04-05
      • 1970-01-01
      • 1970-01-01
      • 2016-03-07
      相关资源
      最近更新 更多