ASP.NET框架中的数据绑定概要与数据绑定表达式的使用
<%#%>语法
ASP.NET介绍了一种新的声明性语法<%#%>。该语法是在.aspx页中使用数据绑定的基础。所有数据绑定表达式都必须包含在这些字符中。下面的列表包含从多个源进行简单数据绑定的示例:
简单属性(用于客户的语法):
<%#custID%>
集合(用于订单的语法):
<asp:ListBoxid="List1"datasource='<%#myArray%>'runat="server">
表达式(用于联系人的语法):
<%#(customer.FirstName+""+customer.LastName)%>
方法结果(用于未结清余额的语法):
<%#GetBalance(custID)%>
在前面的示例中,<%#%>内联标记用于指示将把特定数据源中的信息放在.aspx页中的什么位置。以下数据绑定示例使用TextBoxWeb服务器控件:
<asp:textboxid=txttext="<%#custID%>"runat=server/>
Page.DataBind()versusControl.DataBind()
确定特定数据源并设置.aspx页上的对象之后,您必须将数据绑定到数据源。您可以使用Page.DataBind或Control.DataBind方法将数据绑定到数据源。
这两种方法的使用方式很相似。主要差别在于:调用Page.DataBind方法后,所有数据源都将绑定到它们的服务器控件。在显式调用Web服务器控件的DataBind方法或在调用页面级的Page.DataBind方法之前,不会有任何数据呈现给控件。通常,可以从Page_Load事件调用Page.DataBind(或DataBind)。
数据绑定表达式深入
数据绑定表达式包含在<%#和%>分隔符之内,并使用Eval和Bind函数。Eval函数用于定义单向(只读)绑定。Bind函数用于定义双向(可更新)绑定。除了通过在数据绑定表达式中调用Eval和Bind方法执行数据绑定外,还可以调用<%#和%>分隔符之内的任何公共范围代码,以在页面处理过程中执行该代码并返回一个值。
调用控件或Page类的DataBind方法时,会对数据绑定表达式进行解析。对于有些控件,如GridView、DetailsView和FormView控件,会在控件的PreRender事件期间自动解析数据绑定表达式,不需要显式调用DataBind方法。
下面的代码示例演示如何将数据绑定表达式与ItemTemplate中的FormView控件结合使用。
<asp:FormViewID="FormView1"
DataSourceID="SqlDataSource1"
DataKeyNames="ProductID"
RunAt="server">
<ItemTemplate>
<table>
<tr><tdalign="right"><b>ProductID:</b></td><td><%#Eval("ProductID")%></td></tr>
<tr><tdalign="right"><b>ProductName:</b></td><td><%#Eval("ProductName")%></td></tr>
<tr><tdalign="right"><b>CategoryID:</b></td><td><%#Eval("CategoryID")%></td></tr>
<tr><tdalign="right"><b>QuantityPerUnit:</b></td><td><%#Eval("QuantityPerUnit")%></td></tr>
<tr><tdalign="right"><b>UnitPrice:</b></td><td><%#Eval("UnitPrice")%></td></tr>
</table>
</ItemTemplate>
</asp:FormView>
使用Eval方法
Eval方法可计算数据绑定控件(如GridView、DetailsView和FormView控件)的模板中的后期绑定数据表达式。在运行时,Eval方法调用DataBinder对象的Eval方法,同时引用命名容器的当前数据项。命名容器通常是包含完整记录的数据绑定控件的最小组成部分,如GridView控件中的一行。因此,只能对数据绑定控件的模板内的绑定使用Eval方法。
Eval方法以数据字段的名称作为参数,从数据源的当前记录返回一个包含该字段值的字符串。可以提供第二个参数来指定返回字符串的格式,该参数为可选参数。字符串格式参数使用为String类的Format方法定义的语法。
使用Bind方法
Bind方法与Eval方法有一些相似之处,但也存在很大的差异。虽然可以像使用Eval方法一样使用Bind方法来检索数据绑定字段的值,但当数据可以被修改时,还是要使用Bind方法。
在ASP.NET中,数据绑定控件(如GridView、DetailsView和FormView控件)可自动使用数据源控件的更新、删除和插入操作。例如,如果已为数据源控件定义了SQLSelect、Insert、Delete和Update语句,则通过使用GridView、DetailsView或FormView控件模板中的Bind方法,就可以使控件从模板中的子控件中提取值,并将这些值传递给数据源控件。然后数据源控件将执行适当的数据库命令。出于这个原因,在数据绑定控件的EditItemTemplate或InsertItemTemplate中要使用Bind函数。
Bind方法通常与输入控件一起使用,例如由编辑模式中的GridView行所呈现的TextBox控件。当数据绑定控件将这些输入控件作为自身呈现的一部分创建时,该方法便可提取输入值。
Bind方法采用数据字段的名称作为参数,从而与绑定属性关联,如下面的示例所示:
<EditItemTemplate>
<table>
<tr>
<tdalign=right>
<b>EmployeeID:</b>
</td>
<td>
<%#Eval("EmployeeID")%>
</td>
</tr>
<tr>
<tdalign=right>
<b>FirstName:</b>
</td>
<td>
<asp:TextBoxID="EditFirstNameTextBox"RunAt="Server"
Text='<%#Bind("FirstName")%>'/>
</td>
</tr>
<tr>
<tdalign=right>
<b>LastName:</b>
</td>
<td>
<asp:TextBoxID="EditLastNameTextBox"RunAt="Server"
Text='<%#Bind("LastName")%>'/>
</td>
</tr>
<tr>
<tdcolspan="2">
<asp:LinkButtonID="UpdateButton"RunAt="server"
Text="Update"CommandName="Update"/>
<asp:LinkButtonID="CancelUpdateButton"RunAt="server"
Text="Cancel"CommandName="Cancel"/>
</td>
</tr>
</table>
</EditItemTemplate>
单击行的Update按钮时,使用Bind语法绑定的每个控件属性值都会被提取出来,并传递给数据源控件以执行更新操作。
显式调用DataBind方法
有些控件,如GridView、FormView和DetailsView控件,当它们通过DataSourceID属性绑定到数据源控件时,会通过隐式调用DataBind方法来执行绑定。但是,有些情况需要通过显式调用DataBind方法来执行绑定。
其中一种情况就是使用DataSource属性(而非DataSourceID属性)将某个控件绑定到数据源控件时。在这种情况下,需要显式调用DataBind方法,从而执行数据绑定和解析数据绑定表达式。
另一种情况就是需要手动刷新数据绑定控件中的数据时。假设有这样一个页面,其中有两个控件,这两个控件都显示来自同一数据库的信息(可能使用不同的视图)。在这种情况下,可能需要显式地将控件重新绑定到数据,以保持数据显示的同步。例如,可能有一个显示产品列表的GridView控件,和一个允许用户编辑单个产品的DetailsView控件。虽然GridView和DetailsView控件所显示的数据都来自同一数据源,但被绑定到不同的数据源控件,因为这两个控件使用不同的查询来获取其数据。用户可能会使用DetailsView控件更新记录,从而引发由关联的数据源控件执行更新。但是,由于GridView控件被绑定到不同的数据源控件,所以,该控件仍将显示旧的记录值,直至页面被刷新时才会更新。因此,在DetailsView控件更新数据后,可以调用DataBind方法。这会使GridView控件更新其视图,并重新执行任何数据绑定表达式以及<%#和%>分隔符之内的公共范围代码。这样一来,GridView控件将会反映DetailsView控件所做的更新。
使用对查找表的绑定
一种有关数据绑定控件的常见方案是允许用户使用DropDownList控件或其他列表控件从查找表中选择一个值,以更新或插入该值。在这种情况下,将该查找控件绑定到返回可能值列表的单独数据源,而将该查找控件的选定值绑定到父数据绑定行中的字段。
可以按照如下方法添加此功能。首先,对于查找控件,向数据绑定控件(例如GridView、DetailsView或FormView控件)中的模板添加一个列表控件(DropDownList或ListBox控件)。接着将查找控件的SelectedValue属性绑定到容器控件的数据源中的相关字段。其次,将查找控件的DataSourceID属性设置为可检索查找值的数据源控件。接着将查找控件的DataTextField属性设置为查找表中包含要显示的值的字段,并将其DataValueField属性设置为查找表中包含查找值的唯一标识符的字段(如果适用)。
下面的代码示例演示一个DropDownList控件,此控件包括在FormView控件的InsertItemTemplate模板中(它也可以是包括在DetailsView控件的Fields属性或GridView控件的Columns属性中的TemplateField的InsertItemTemplate模板)。DropDownList控件的SelectedValue属性使用Bind方法实现与FormView控件当前行的CategoryID字段之间的双向绑定。将DropDownList控件的DataSourceID属性设置为单独的数据源控件,用于检索可能的类别名称和ID列表。将DropDownList控件的DataTextField属性设置为查找数据源中的CategoryName字段,以便显示可能的类别名称列表。将DropDownList控件的DataValueField属性设置为查找数据源中相关类别名称的CategoryID字段。当用户从列表中选择类别名称时,DropDownList控件的SelectedValue属性将被设置为选定类别名称的类别ID。