【问题标题】:ASP.net web server controlASP.net 网络服务器控制
【发布时间】:2009-09-10 04:50:40
【问题描述】:

我有一个关于连接 Web 服务器控件的问题。从我看到的许多示例中,事件处理程序已使用私有访问修饰符声明。我尝试这样做,如图所示:

    <asp:Label runat="server" ID="lblMessage" Font-Names="Verdana" Text="Hello" />
        <br />
    <asp:Button runat="server" ID="btnSubmit" text="click me!" onClick="btnSubmit_Click" />

在文件后面的代码中:

    private void btnSubmit_Click(object sender, EventArgs e)
    {
        lblMessage.Text = "Goodbye";
    }

但除非我将访问权限更改为受保护,否则编译器无法找到单击处理程序。

按钮事件处理程序是否应该是私有的,如果是,为什么它在我的实例中不起作用?

此外,除了使用 onClick 属性之外,还有其他方法可以将事件处理程序连接到在 .aspx 文件中以声明方式创建的控件吗?

提前致谢, 勇

【问题讨论】:

    标签: asp.net controls


    【解决方案1】:

    这里可能令人困惑的是,许多人在视觉上设计他们的 Web 表单。当他们想要将单击处理程序连接到按钮服务器控件时,他们通常双击该按钮或在 Visual Studio 中选择它,按 F4 转到其属性并在该窗口中设置其事件。这些方法中的任何一种都有以下效果:

    1. 在类后面的代码中创建了一个私有处理程序。它的名字是[控件名称]_[事件]。在您的情况下,这是 btnSubmit_Click。

    2. 同样在代码隐藏文件中,每个 Web 服务器控件都有一个对应的代码隐藏类的受保护成员。在 Init even 中,新创建的处理程序通过以下代码与服务器控件上的 Click 事件相关联:

      btnSubmit.Click += btnSubmit_Click;

    使用这种方法,处理程序仍然可以是私有的。当您尝试在 ASPX 文件本身中设置处理程序时,您会遇到问题。在这种情况下,您必须按照您的指示将事件处理程序更新为非私有的,或者在 ASPX 页面本身中定义以下内容:

    <script language="C#" runat="server">
      public void btnSubmit_Click(object sender, EventArgs e)
      {
        ..
      }
    </script>
    

    代码隐藏类的私有方法/属性对 ASPX 页面不可见。

    【讨论】:

    • 谢谢大卫,我想这突显了 Visual Studio 自动化这么多编码过程的能力的一个缺点,它掩盖了实际上发生的事情,而且很多时候你会失去它更深的了解。很好的解释。
    • 私有处理程序行为仅适用于 Visual Studio 2003,2005+ 将其写入 ASPX 文件并创建受保护的方法 AFAIK。
    【解决方案2】:

    事件处理程序必须是protected。原因是 ASP.NET 实际上生成了一个新类,它继承自您在代码隐藏中定义的类,而不是使用该类本身。

    作为替代,你可以写:

    btnSubmit.Click += new EventHandler(btnSubmit_Click);
    

    在 Page_Load 处理程序中,但我不推荐它。在 VB.NET 中,我相信您也可以使用 Handles 关键字,但它在 C# 中不可用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-25
      • 1970-01-01
      • 2015-03-31
      相关资源
      最近更新 更多