模板化的數據綁定控件為我們在頁面上顯示數據提供了根本的靈活性。你可能還記得ASP.net v1.x中的幾個模板化控件(例如DataList和Repeater控件)。ASP.NET 2.0仍然支持這些控件,但在模板中綁定數據的語法已經被簡化和改善了。本文將討論在數據綁定控件模板中綁定數據的多種方法。
數據綁定表達式
ASP.NET 2.0改善了模板中的數據綁定操作,把v1.x中的數據綁定語法DataBinder.Eval(Container.DataItem, fieldname)簡化為Eval(fieldname)。Eval方法與DataBinder.Eval一樣可以接受一個可選的格式化字符串參數。縮短的Eval語法與DataBinder.Eval的不同點在於,Eval會根據最近的容器對象(例如DataListItem)的DataItem屬性來自動地解析字段,而DataBinder.Eval需要使用參數來指定容器。由於這個原因,Eval只能在數據綁定控件的模板中使用,而不能用於Page(頁面)層。當然,ASP.NET 2.0頁面中仍然支持DataBinder.Eval,你可以在不支持簡化的Eval語法的環境中使用它。
下面的例子演示了如何使用新的簡化的Eval數據綁定語法綁定到DataList數據項模板(ItemTemplate)中的Image、Label和HyPerlink控件。
<asp:DataList ID="DataList1" RepeatColumns="5" Width="600" runat="server" DataSourceID="ObjectDataSource1">
<ItemTemplate>
<asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl='<%# Eval("PhotoID", "PhotoFormViewPlain.aspx?ID={0}") %>'>
<asp:Image ID="Image1" Runat="server" ImageUrl='<%# Eval("FileName", "images/thumbs/{0}") %>' /></asp:HyperLink>
<asp:Label ID="CaptionLabel" runat="server" Text='<%# Eval("Caption") %>' />
</ItemTemplate>
</asp:DataList><br />
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" TypeName="DataComponentTableAdapters.PhotosTableAdapter" SelectMethod="GetPhotosForAlbum">
數據綁定也可以作為控件的主題定義(theme definition)的一部分,這樣我們就可以通過改變主題來隨意地改變模板化控件的布局和外觀。但是Theme(主題)模板中只能使用Eval(或者後面討論的Bind)。綁定到任意的用戶代碼是被禁止的。
FormView控件
DataList控件在來自數據源的數據項中進行迭代操作,並為每個數據項輸出ItemTemplate(數據項模板)。這對於顯示數據項列表是有用的,但是通常情況下,你希望在一個窗體中實現單條數據項的綁定操作。為了實現這個目的,ASP.NET 2.0引入了FormView控件,它能夠在任意的模板中每次顯示一個數據項。DetailsView和FormView之間的主要差異在於,DetailsView擁有內建的表格顯示方式,而FormView需要使用用戶自定義的顯示模板。在其它方面FormView和DetailsView對象模型是非常相似的。下面的例子顯示了一個綁定到ObjectDataSource的FormView控件。該FormView的ItemTemplate屬性包含數據綁定的Image、Label和HyperLink控件,與前面的DataList示例類似。
<asp:FormView ID="FormView1" runat="server" DataSourceID="ObjectDataSource1">
<ItemTemplate>
<asp:Label ID="CaptionLabel" runat="server" Text='<%# Eval("Caption") %>' Font-Size="32pt" /><br />
<asp:Image ID="Image1" runat="server" ImageUrl='<%# Eval("FileName", "images/{0}") %>' />
<asp:HyperLink ID="HyperLink1" Text="Back to Album" NavigateUrl='<%# Eval("AlbumID", "PhotosDataList.aspx?ID={0}") %>' runat="server" />
</ItemTemplate>
</asp:FormView>
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" TypeName="DataComponentTableAdapters.PhotosTableAdapter" SelectMethod="GetPhoto">
<SelectParameters>
<asp:QueryStringParameter Name="PhotoID" DefaultValue="9" QueryStringField="ID" />
</SelectParameters>
</asp:ObjectDataSource>
FormView與DetailsView類似,也跟蹤當前顯示的數據項,但是當數據源返回列表的時候,我們也可以選擇支持多個數據項的分頁操作。下面的例子顯示了一個帶有分頁功能的FormView。
<asp:FormView ID="FormView1" Runat="server" DataSourceID="SqlDataSource1"
HeaderText="Books for Author" AllowPaging="True">
<ItemTemplate>
<asp:Image ID="Image1" ImageUrl='<%# Eval("title_id","~/Images/{0}.gif") %>' Runat="server" />
<asp:Label ID="Label1" Font-Size="1.2em" Font-Bold="true" Text='<%# Eval("title") %>' runat="server" />
<asp:Label ID="Label2" Text='<%# Eval("price","{0:c}") %>' runat="server" />
</ItemTemplate>
</asp:FormView>
<asp:SqlDataSource ID="SqlDataSource1" Runat="server" SelectCommand="SELECT dbo.authors.au_id, dbo.titles.title_id, dbo.titles.title, dbo.titles.type, dbo.titles.price, dbo.titles.notes FROM dbo.authors INNER JOIN dbo.titleauthor ON dbo.authors.au_id = dbo.titleauthor.au_id INNER JOIN dbo.titles ON dbo.titleauthor.title_id = dbo.titles.title_id WHERE (dbo.authors.au_id = @au_id)"
ConnectionString="<%$ ConnectionStrings:Pubs %>">
<SelectParameters>
<asp:QueryStringParameter Name="au_id" DefaultValue="213-46-8915" QueryStringField="ID" />
</SelectParameters>
</asp:SqlDataSource>