日期:2011-08-17  浏览次数:20676 次

代码隐藏


虽然该代码隐藏模型在 2.0 中是不同的,但是它的语法已经进行了少量更改。实际上,该更改十分细微,如果您不仔细查看,甚至都无法注意到它
Figure 1 Syntax in ASP.NET 2.0

Default.aspx
<%@ Page Language="C#" AutoEventWireup="true"
    CodeFile="Default.aspx.cs" Inherits="MsdnMag.Default" %>

Default.aspx.cs
namespace MsdnMag
{
    public partial class Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
        }
    }
}

图 1 显示新的代码隐藏语法。

该模型与以前的 1.x 模型有两个区别 — 在 @ Page 指令中引入了 CodeFile 属性,以及将代码隐藏类声明为部分类。当开始生成该页时,您将注意到另一个区别 — 服务器端控件不再需要在代码隐藏类中显式声明,但是您仍然能够以编程方式完整地访问它们。例如,
Figure 2 Implicit Server-Side Control Access

Default.aspx
<%@ Page Language="C#" AutoEventWireup="true" 
    CodeFile="Default.aspx.cs" Inherits="MsdnMag.Default" %>

<!DOCTYPE html PUBLIC "..." "...">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
     Enter your name:
     <asp:TextBox ID="_nameTextBox" runat="server" /><br />
     <asp:Button ID="_enterButton" runat="server"
                 Text="Enter" /> <br />
     <asp:Label ID="_messageLabel" runat="server" />   
    </div>
    </form>
</body>
</html>

Default.aspx.cs
namespace MsdnMag
{
  public partial class Default : System.Web.UI.Page
  {
    protected void _enterButton_Click(object sender, EventArgs e)
    {
      _messageLabel.Text = "Hello there " + _nameTextBox.Text + "!";
    }
  }
}

图 2 中的窗体有若干个在代码隐藏文件中以编程方式使用的服务器端控件,但是您可以注意到,代码隐藏类中缺少任何显式控件声明。

其中的原因与应用于代码隐藏类的部分关键字有关。除了使用呈现该页的方法将 .aspx 文件转换为一个类定义(正如它已经做的一样),ASP.NET 现在也为包含受保护控件成员变量声明的代码隐藏类生成一个同辈部分类。然后,您的类与该生成的类定义一起编译,并用作针对 .aspx 文件生成的类的基类。结果是,您基本上以经常使用的方式编写代码隐藏类,但是您不再需要声明(或让服务器为您声明)服务器端控件的成员变量声明。这一直是 1.x 中一个不太稳定的关系,因为如果您无意间修改了一个控件声明,使得它不再与该窗体上所声明控件的 ID 匹配,就会突然停止工作。现在,成员变量以隐式方式声明并始终是正确的。
Figure 3 Class Generation with Codebehind

Class for ASPX file generated by ASP.NET
namespace ASP
{
    public class default_aspx : MsdnMag.Default
    {
       ...
    }
}

Sibling partial class generated by ASP.NET
namespace MsdnMag
{
  public partial class Default : IRequiresSessionState
  {
    protected TextBox  _nameTextBox;
    protected Button   _enterButton;
    protected Label    _messageLabel;
    private   HtmlForm form1;
    ...
  }
}

Codebehind partial class that you write
namespace MsdnMag
{
  public partial class Default : Page
  {
    void _enterButton_Click(object sender, EventArgs e)
    {
       _messageLabel.Text = "Hello there " + _nameTextBox.Text + "!";
    }
  }
}

图 3 显示所涉及类集的一个示例。

请注意,该部分类模型仅当在 @ Page 指令中使用 CodeFile 关键字时使用。如果使用不带 CodeFile(或者带有 src 属性)的 Inherits 关键字,ASP.NET 会使用 1.x 代码隐藏类型并简单