單一屬性 | Customer: <%# custID %> |
集合Orders | <asp:ListBox id="List1" datasource='<%# myArray %>' runat="server"> |
表達式Contact | <%# ( customer.FirstName + " + customer.LastName ) %> |
方法的回傳值 | Outstanding Balance: <%# GetBalance(custID) %> |
儘管上面的語法與ASP的Response.Write便捷語法(<%= %>)看起來類似,但是它們的行為行為卻決然不同。 ASP Response.Write便利語法在頁面處理的時候計算值,而ASP.NET資料綁定語法只在DataBind方法被呼叫的時候才計算值。
DataBind是頁面和所有務器控制的一個方法。當你呼叫父控制項的DataBind的時候,它會依序呼叫所有子控制項的DataBind方法。例如,DataList1.DataBind()就會呼叫DataList範本中的所有控制項的DataBind方法。呼叫頁面的DataBind方法--Page.DataBind() 或簡單地呼叫DataBind()--會引發頁面上所有的資料綁定表達式的計算操作。通常只在頁面的Page_Load事件中呼叫DataBind方法,如下面的範例所示。
在.aspx頁面的任何宣告式片段中,你都可以使用綁定語法,並為它的估值指定運行時所期望的資料類型。上面範例中的簡單屬性、表達式和方法在被計算的時候會向使用者顯示文字內容。在這種情況下,資料綁定表達式的值是String類型的。在上面的集合範例中,資料綁定語法的值的類型是ListBox的DataSource屬性。你會發現在綁定表達式中強制轉換值的類型對於產生期望的結果是必要的。例如,如果count是整數:
Number of Records: <%# count.ToString() %>
ASP.NET資料綁定語法支援公用變數、頁面的屬性和頁面中其它控制項的屬性的綁定。下面的範例示範如何綁定到公共變數和頁面的簡單屬性。請注意,在DataBind()被呼叫之前,這些值都已經初始化過了。
<script language="VB" runat="server">
Sub Page_Load(sender As Object, e As EventArgs)
Page.DataBind
End Sub
ReadOnly Property custID() As String
Get
Return "ALFKI"
End Get
End Property
ReadOnly Property orderCount() As Integer
Get
Return 11
End Get
End Property
</script>
<form action="DataBind1_vb.aspx" 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="Button1" Text="Submit" OnClick="SubmitBtn_Click" runat="server"/>
Selected State: <asp:label ID="Label1" text='<%# StateList.SelectedItem.Text %>' runat="server"/>
清單類型的伺服器控制項(例如DropDownList、ListBox和HTMLSelect)把集合當作資料來源。下面的範例示範如何綁定到通用語言運行時集合類型。這些控制項只能綁定到支援Ienumerable、Icollection或IlistSource介面的集合。更常見的是,它可以綁定到ArrayList、Hashtable、DataView和DataReader。下面的範例示範如何綁定到ArrayList。
Sub Page_Load(sender As Object, e As EventArgs)
If Not IsPostBack Then
Dim values as ArrayList= new ArrayList()
values.Add ("IN")
values.Add ("KS")
values.Add ("MD")
values.Add ("MI")
values.Add ("OR")
values.Add ("TN")
DropDown1.DataSource = values
DropDown1.DataBind
End If
End Sub
下面的範例示範如何綁定到DataView。請注意DataView類別是在System.Data名字空間中定義的。
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
dt.Columns.Add(New DataColumn("IntegerValue", GetType(Integer)))
dt.Columns.Add(New DataColumn("StringValue", GetType(String)))
dt.Columns.Add(New DataColumn("DateTimeValue", GetType(DateTime)))
dt.Columns.Add(New DataColumn("BooleanValue", GetType(Boolean))))
'填入一些資料
For i = 1 To 9
dr = dt.NewRow()
dr(0) = i
dr(1) = "Item " + i.ToString()
dr(2) = DateTime.Now.ToShortTimeString
If (i Mod 2 <> 0) Then
dr(3) = True
Else
dr(3) = False
End If
'把資料行加到表dt.Rows.Add(dr)
Next
GridView1.DataSource = New DataView(dt)
GridView1.DataBind()
End If
End Sub
下面的範例示範如何綁定到Hashtable。
Sub Page_Load(sender As Object, e As EventArgs)
If Not IsPostBack Then
Dim h As Hashtable = new Hashtable()
h.Add ("key1", "value1")
h.Add ("key2", "value2")
h.Add ("key3", "value3")
MyDataList.DataSource = h
MyDataList.DataBind
End If
End Sub
通常情況下,你可能會想要綁定到頁面或控制項之前先處理資料。下面的範例示範如何綁定到表達式和方法的回傳值。
Sub Page_Load(sender As Object, e As EventArgs)
If Not IsPostBack Then
Dim values as ArrayList= new ArrayList()
values.Add (0)
values.Add (1)
values.Add (2)
values.Add (3)
values.Add (4)
values.Add (5)
values.Add (6)
DataList1.DataSource = values
DataList1.DataBind
End If
End Sub
Function EvenOrOdd(number As Integer) As String
If (number Mod 2 <> 0) Then
Return "Odd"
Else
Return "Even"
End If
End Function
<asp:DataList id="DataList1" ……>
<ItemTemplate>
Number Value: <%# Container.DataItem %>
Even/Odd: <%# EvenOrOdd(Container.DataItem) %>
</ItemTemplate>
</asp:DataList>
ASP.NET頁面框架元件提供了一個靜態的方法,它估算延遲綁定(late-bound)的資料綁定表達式並且可以選擇將其結果格式化為字串。在這種情況下,DataBinder.Eval很方便,因為它消除了開發者把估值轉會為期望的資料類型所必須執行的許多明確轉換工作。當模板化清單中有資料綁定控制項的時候,它特別有用處,因為在那種情況下,通常資料行和資料欄位都必須轉換。
看看下面的例子,它需要把整數顯示為貨幣字串。在標準的ASP.NET資料綁定語法中,你必須先轉換資料行的型別以檢索資料欄位IntegerValue。接著把它當作參數傳遞給String.Format方法。
<%# String.Format("{0:c}", (CType(Container.DataItem, DataRowView)("IntegerValue"))) %>
這個語法很複雜且不容易被記住。與此形成對照的是,DataBinder.Eval是一個簡單的方法,它只有三個參數:資料項目的命名容器(naming container)、資料欄位名稱和格式化字串。在模板化的控制項(例如FormView、 GridView、DetailsView、DataList或Repeater)中,命名容器都是Container.DataItem。頁面(Page)是另一個命名容器,也可以用於DataBinder.Eval。前面我們提到,ASP.NET 2.0為DataBinder.Eval提供了一個新的簡化的語法(Eval),你可以在資料綁定的控制項範本中使用它來自動解析Container.DataItem。
<%# DataBinder.Eval(Container.DataItem, "IntegerValue", "{0:c}") %>
<%# Eval("IntegerValue", "{0:c}") %>
格式化字串參數是可選的。如果省略了這個參數,DataBinder.Eval會回傳Object類型值,如下所示:
<%# CType(DataBinder.Eval(Container.DataItem, "BoolValue"), Boolean) %>
我們要專注的是,與標準的資料綁定語法相比,DataBinder.Eval會明顯地影響效能,這是因為它使用了延遲綁定的反射(reflection)。請明智地使用DataBinder.Eval,特別是在不需要格式化字串的情況下。