ASP.NET 2.0 中實現模板中的資料繫結系列
最後更新:2018-12-05
來源:互聯網
上載者:User
模板化的資料繫結控制項為我們在頁面上顯示資料提供了根本的靈活性。你可能還記得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>