在前面的
模板中的数据绑定
部分中我们论述过
ASP
NET包含了一种宣告式的数据绑定语法
用于在数据绑定模板中把数据源字段与控件的属性相关联
你也可以在代码中使用<%#
>语法来进行任意值的数据绑定
例如页面和控件属性
集合
表达式
甚至于方法调用的返回结果
为了强制计算数据绑定的值
你必须在包含数据绑定语法的页面或控件上调用DataBind方法
下面的表格显示了ASP
NET中的数据绑定语法的一些例子
单个属性Customer: <%# custID %>集合 Orders<asp:ListBox id=List datasource=<%# myArray %> runat=server>表达式 Contact<%# ( customerFirstName + + customerLastName ) %>方法的返回值Outstanding Balance: <%# GetBalance(custID) %>
尽管上面的语法与ASP的ResponseWrite便捷语法(<%= %>)看起来类似但是它们的行为却决然不同ASP ResponseWrite便捷语法在页面处理的时候计算值而ASPNET数据绑定语法只在DataBind方法被调用的时候才计算值
DataBind是页面和所有务器控件的一个方法当你调用父控件的DataBind的时候它会依次调用所有子控件的DataBind方法例如DataListDataBind()就会调用DataList模板中的所有控件的DataBind方法调用页面的DataBind方法PageDataBind() 或简单地调用 DataBind()会引发页面上所有的数据绑定表达式的计算操作通常只在页面的Page_Load事件中调用DataBind方法如下面的例子所示
在aspx页面的任何宣告式片断中你都可以使用绑定语法并为它的估值指定运行时所期望的数据类型上面例子中的简单属性表达式和方法在被计算的时候会向用户显示文本内容在这种情况下数据绑定表达式的值是String类型的在上面的集合例子中数据绑定语法的值的类型是ListBox的DataSource属性你会发现在绑定表达式中强制转换值的类型对于生成期望的结果是必要的例如如果count是一个整数
Number of Records: <%# countToString() %>
ASPNET数据绑定语法支持公共变量页面的属性和页面中其它控件的属性的绑定下面的例子演示了如何绑定到公共变量和页面的简单属性请注意在DataBind()被调用之前这些值都已经初始化过了
<script language=VB runat=server>
Sub Page_Load(sender As Object e As EventArgs)
PageDataBind
End Sub
ReadOnly Property custID() As String
Get
Return ALFKI
End Get
End Property
ReadOnly Property orderCount() As Integer
Get
Return
End Get
End Property
</script>
<form action=DataBind_vbaspx runat=server>
Customer: <b><%# custID %></b><br />
Open Orders: <b><%# orderCount %></b>
</form>
下面的例子演示如何绑定到另一个控件的属性
<asp:DropDownList id=StateList runat=server>
<asp:ListItem>CA</asp:ListItem>
……
</asp:DropDownList>
<asp:button ID=Button Text=Submit OnClick=SubmitBtn_Click runat=server/>
Selected State: <asp:label ID=Label text=<%# StateListSelectedItemText %> runat=server/>列表类型的服务器控件(例如DropDownListListBox和HTMLSelect)把集合作为数据源下面的例子演示如何绑定到通用语言运行时集合类型这些控件只能绑定到支持IenumerableIcollection或IlistSource接口的集合更为常见的是它可以绑定到ArrayListHashtableDataView和DataReader下面的例子演示了如何绑定到ArrayList
Sub Page_Load(sender As Object e As EventArgs)
If Not IsPostBack Then
Dim values as ArrayList= new ArrayList()
valuesAdd (IN)
valuesAdd (KS)
valuesAdd (MD)
valuesAdd (MI)
valuesAdd (OR)
valuesAdd (TN)
DropDownDataSource = values
DropDownDataBind
End If
End Sub
下面的例子演示了如何绑定到DataView请注意DataView类是在SystemData名字空间中定义的
Sub Page_Load(sender As Object
e As EventArgs)
If Not IsPostBack Then
Dim dt As DataTable
Dim dr As DataRow
Dim i As Integer
建立DataTable
dt = New DataTable
dtColumnsAdd(New DataColumn(IntegerValue GetType(Integer)))
dtColumnsAdd(New DataColumn(StringValue GetType(String)))
dtColumnsAdd(New DataColumn(DateTimeValue GetType(DateTime)))
dtColumnsAdd(New DataColumn(BooleanValue GetType(Boolean)))
填充一些数据
For i = To
dr = dtNewRow()
dr() = i
dr() = Item + iToString()
dr() = DateTimeNowToShortTimeString
If (i Mod <> ) Then
dr() = True
Else
dr() = False
End If
把数据行添加到表
dtRowsAdd(dr)
Next
GridViewDataSource = New DataView(dt)
GridViewDataBind()
End If
End Sub
下面的例子演示了如何绑定到Hashtable
Sub Page_Load(sender As Object e As EventArgs)
If Not IsPostBack Then
Dim h As Hashtable = new Hashtable()
hAdd (key value)
hAdd (key value)
hAdd (key value)
MyDataListDataSource = h
MyDataListDataBind
End If
End Sub
通常情况下你可能希望绑定到页面或控件之前先处理数据下面的例子演示了如何绑定到表达式和方法的返回值
Sub Page_Load(sender As Object e As EventArgs)
If Not IsPostBack Then
Dim values as ArrayList= new ArrayList()
valuesAdd ()
valuesAdd ()
valuesAdd ()
valuesAdd ()
valuesAdd ()
valuesAdd ()
valuesAdd ()
DataListDataSource = values
DataListDataBind
End If
End Sub
Function EvenOrOdd(number As Integer) As String
If (number Mod <> ) Then
Return Odd
Else
Return Even
End If
End Function
<asp:DataList id=DataList ……>
<ItemTemplate>
Number Value: <%# ContainerDataItem %>
Even/Odd: <%# EvenOrOdd(ContainerDataItem) %>
</ItemTemplate>
</asp:DataList>
ASPNET页面框架组件提供了一个静态的方法它估算延迟绑定(latebound)的数据绑定表达式并可以选择把其结果格式化为字符串在这种情况下DataBinderEval很方便因为它消除了开发者把估值转会为期望的数据类型所必须执行的很多显式转化工作当模板化列表中有数据绑定控件的时候它特别有用处因为在那种情况下通常数据行和数据字段都必须转换
看看下面的例子它需要把整数显示为货币字符串在标准的ASPNET数据绑定语法中你必须首先转换数据行的类型以检索数据字段IntegerValue接着把它作为参数传递给StringFormat方法
<%# String
Format(
{
:c}
(CType(Container
DataItem
DataRowView)(
IntegerValue
))) %>
这个语法很复杂并且不容易记住与此形成对照的是DataBinderEval是一个简单的方法它只有三个参数数据项的命名容器(naming container)数据字段名称和格式化字符串在模板化的控件(例如FormView GridViewDetailsViewDataList或Repeater)中命名容器都是ContainerDataItem页面(Page)是另一种命名容器也可以用于DataBinderEval前面我们提到ASPNET 为DataBinderEval提供了一个新的简化的语法(Eval)你可以在数据绑定的控件模板中使用它来自动解析ContainerDataItem
<%# DataBinderEval(ContainerDataItem IntegerValue {:c}) %>
<%# Eval(IntegerValue {:c}) %>
格式化字符串参数是可选的如果省略了这个参数DataBinderEval会返回Object类型值如下所示
<%# CType(DataBinderEval(ContainerDataItem BoolValue) Boolean) %>
我们要重点注意的是与标准的数据绑定语法相比DataBinderEval会明显地影响性能这是因为它使用了延迟绑定的反射(reflection)请明智地使用DataBinderEval特别是在不需要格式化字符串的情况下