【问题标题】:What value should AutoEventWireup be set to in the page directive in ASP.Net?AutoEventWireup 应该在 ASP.Net 的页面指令中设置为什么值?
【发布时间】:2008-10-23 15:50:03
【问题描述】:

我正在使用 C#。默认情况下,当我在 Visual Studio 2008 中添加带有或不带有母版页的 Web 表单时,页面指令中的 AutoEventWireup 属性设置为 true。此属性在母版页主指令中也设置为 true。

我应该将 AutoEventWireup 设置为什么值(真/假)?

这两种价值观的优缺点是什么?

非常感谢任何帮助。

谢谢。

【问题讨论】:

    标签: c# asp.net vb.net


    【解决方案1】:

    这是一种根据 Microsoft 设置的命名约定自动将事件处理程序连接到事件的方法。

    如果我没记错的话,这是通过反射实现的。在运行时,ASP.NET 将检查您的类,查找具有与预期命名约定匹配的签名的方法,然后将它们连接起来作为各自事件的处理程序。

    也就是说,优点是它是一种标准方法,可以省去您自己连接事件处理程序的麻烦。一个明显的“骗局”是它需要一个额外的步骤(反思),这比你自己做的成本要高一些。

    在大多数情况下,反射“成本”是如此之少,以至于真的不值得一提,但重要的是要了解幕后发生的事情。

    【讨论】:

      【解决方案2】:

      这只会导致运行时自动将传统的页面生命周期方法(如 Page_Load)连接到其等效的事件处理程序 (Page.Load)。如果您将 AutoEventWireup 设置为 false,那么您需要类似以下内容:

      protected override void OnLoad(EventArgs e)
      {
         base.OnLoad(e); 
      }
      

      而不是 MS 约定:

      protected void Page_Load(object sender, EventArgs e)
      {
      }
      

      您也不必担心调用 base.OnLoad,因为wireup 会自动执行此操作。但是,将其设置为 false 可能会带来一点性能优势 - 不过我从未验证过。

      -内特·戴维斯

      【讨论】:

      • 这大部分是不正确的 - 您显示的第一个方法不是事件处理程序,而是覆盖。有很大的不同,我建议你阅读这个主题。您必须手动连接事物的方式是编写代码,通常在构造函数中,如下所示:
      • this.Load += new EventHandler(MyPage_Load);
      • 然后,您将使用与自动生成的 Page_Load 处理程序相同的签名来实现 MyPage_Load:
      • protected void MyPage_Load(object sender, EventArgs e) { }
      • 错了杰森,他是对的。我认为你应该复习一下这个主题。虚拟方法是调用事件的方法,但在完全相同的时间调用。你应该在投反对票之前阅读。
      【解决方案3】:

      如果它设置为 false,那么如果您有 Page_Load 或 Page_PreInit 之类的方法,它们将永远不会触发。 AutoEventWireup 意味着如果有这样命名的事件,它们应该有事件处理程序连接到这些事件。

      【讨论】:

        猜你喜欢
        • 2011-07-27
        • 2013-05-16
        • 1970-01-01
        • 1970-01-01
        • 2010-10-04
        • 2015-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多