对 Web 窗体页中的各项控件属性进行数据绑定不是通过直接将属性绑定到数据源来实现的。而是通过使用特殊的表达式格式来实现数据绑定的。与要绑定到的数据有关的信息被置入该表达式,然后将表达式的结果分配给控件属性。
例如,假设您要将 TextBox Web 服务器控件绑定到一些数据。您创建数据绑定表达式并将其分配给控件的 Text 属性,以便该值将在控件中显示。
下面的示例说明控件声明在 HTML 视图中的大体形式。控件的 Text 属性被绑定到包含单个记录的数据视图。数据绑定表达式是用字符 <%# 和 %> 分隔的。
<asp:TextBox id="TextBox1" runat="server" Text=‘’<%# DataView1(0)("au_lname") %>‘’> </asp:TextBox>同样,可以使用数据绑定表达式来设置 Image Web 服务器控件的 ImageUrl 属性。在这种情况下,您是在从数据库中提取一个字符串,该字符串包含要显示的图形的路径和文件名。一个示例可能类似于如下所示:
<asp:Image id=Image1 runat="server" ImageUrl=‘’<%# DataView(0)("productPhotoURL") %>‘’>在 Visual Studio 中,“属性”窗口向您提供创建数据绑定表达式的工具。您还可以选择自行创建绑定表达式并在 Web 窗体设计器的 HTML 视图中输入它们。
使用数据绑定表达式的优点
使用数据绑定表达式在以下几个方面为您提供灵活性:
尽管您可以实际使用解析为一个值的任何表达式来进行数据绑定,但在大多数情况下,您将绑定到某些类型的数据源。最为常见的情况是数据集或数据视图中的表,表中包含您感兴趣的单个记录。为了简化此类型的数据绑定,ASP.NET 服务器控件支持名为 DataBinder 的类,它执行某些提取数据并使其可用于控件属性的工作。
可以通过调用其 Eval 方法来使用 DataBinder 类,这要求两个参数:
下面的示例说明与上面的文本框所执行的相同的数据绑定,但这一次使用 DataBinder 类。
<asp:TextBox id="TextBox1" runat="server" Text=‘’<%# DataBinder.Eval(DataView1, "[0].au_lname") %>‘’> </asp:TextBox>先前设置 Image 控件 ImageUrl 属性的示例可能类似于如下所示。在该示例中,一个格式设置表达式在 DataBinder.Eval 方法的第二个参数(可选)中传递;该表达式将一个路径当作前缀添加到数据中。
<asp:Image id=Image1 runat="server" ImageUrl=‘’<%# DataBinder.Eval(Container, "DataItem.ProductImage", "http://myserver/myapps/images/{0}") %>‘’>使用 DataBinder 类的优点是:
为了提供控件可以绑定到的值,必须在运行时解析数据绑定表达式。通过调用 DataBind 方法(它是 System.Web.UI.Control 类的方法),可以在页处理期间显式执行此步骤。可以为单独的控件调用该方法,或者更为有效的是,可以为 Page 类(也是从 Control 类导出的)调用该方法。此方法级联对所有子控件的调用,所以通过为该页调用此方法一次,您可以为该页上的所有控件调用它。
通常在以下情况下调用 DataBind 方法:
下面的示例说明在页初始化事件期间调用 DataBind 方法的典型方式:
‘’ Visual Basic Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load SqlDataAdapter1.Fill(DsAuthors1, "authors") If Not (Me.IsPostBack) Then Me.DataBind() End If End Sub // C# private void Page_Load(object sender, System.EventArgs e) { SqlDataAdapter1.Fill(dsAuthors1, "authors"); if (!this.IsPostBack) { this.DataBind(); } }通常不需要在每个往返过程中都调用 DataBind 方法(即在页初始化中不需要检查回发),因为这样做会替换控件中的值。例如,如果您使用 DataGrid 控件,该控件可能包含您要处理的更改。在您调用 DataBind 时,用来自数据源的值代替网格的内容。如果在页初始化期间执行此操作,您将在有机会处理更改前,失去网格中的更改。您而是应通常在为该事件执行了数据处理后,在事件处理程序中调用 DataBind 方法。