深入研究 Repeater
在所有這三個數據 Web 控件中,Repeater Web 控件在呈現的 HTML 里提供了最大的靈活性。 DataGrid 或 DataList 會在預設的 HTML 標記中自動包含開發人員指定的內容。與它們不同的是,Repeater 在呈現的時候將嚴格生成指定的 HTML 標記。 因此,如果不想用 HTML的table或者一系列span,標記顯示數據,而希望以其他方式顯示數據,就必須使用Repeater 控件。
就像 DataList 一樣,使用 Repeater 時要用模板指定標記。 Repeater 包含下列五個模板:
AlternatingItemTemplate
FooterTemplate
HeaderTemplate
ItemTemplate
SeparatorTemplate
HeaderTemplate 和 FooterTemplate 指定出現在綁定到 Repeater 的數據之前和之后的 HTML 標記。 AlternatingItemTemplate 和 ItemTemplate 指定用于呈現 Repeater 的DataSource中的每條記錄的 HTML 標記和數據綁定語法。 例如,假設您要把包含雇員信息的數據集綁定到 Repeater,該數據集的其中一個字段是EmployeeName。如果要在 Web 頁上以無序列表的形式顯示雇員列表,則可以使用如下 Repeater 語法:
<asp:Repeater runat="server" id="rptEmployees"> <HeaderTemplate> <ul> </HeaderTemplate> <ItemTemplate> <li><%# DataBinder.Eval(Container.DataItem, "EmployeeName") %></li> </ItemTemplate> <FooterTemplate> </ul> </FooterTemplate> </asp:Repeater>
與 DataGrid 和 DataList 不同,Repeater 類不是從WebControl類派生的。 因此,Repeater 缺少 DataGrid 和 DataList 二者共有的樣式屬性。 這一點歸結起來無非是說,如果想對 Repeater 中所顯示數據進行格式設置,則必須在 HTML 標記中進行這樣的操作。 例如,在上面的例子中,如果想用粗體顯示雇員的姓名,則必須更改 ItemTemplate 以包含 HTML 粗體標記,就像下面這樣:
<ItemTemplate> <li><b><%# DataBinder.Eval(Container.DataItem, "EmployeeName") %></b></li> </ItemTemplate>
然而對于 DataGrid 或 DataList,通過把控件的ItemStyle-Font-Bold屬性設置為 True,就能用粗體顯示文本了。Repeater 缺少樣式屬性會大大增加開發的時間指標。 例如,假設決定使用 Repeater 顯示數據,這些數據需要以粗體、中間對齊且帶有特定背景色的特定字體顯示。 所有這些都要用幾個 HTML 標記指定,這些標記很快就會使 Repeater 的模板變得凌亂不堪。 這種凌亂會使以后對外觀進行更改變得困難得多,尤其是當其他人對該項目進行操作時,則不得不查看大量 HTML 語法。 將這一點與為 DataGrid 或 DataList 指定格式進行比較。 對于這兩個控件中的任何一個,都可以通過指定 DataGrid 或 DataList 的樣式屬性來使模板免于凌亂。 此外,可以用一些工具來自動設置 DataGrid 和 DataList 的樣式屬性,例如 Microsoft Visual Studio .NET 或 ASP.NET Web Matrix。
除了延長開發時間之外,Repeater 還缺少有助于支持分頁、編輯或數據編輯的內置功能。 由于缺少這些功能支持,Repeater 在可用性的評定中得分很低。 當然,如果所有您感興趣的只是顯示數據,而不用帶任何別致的鈴聲或口哨聲,那么 Repeater 的功能匱乏就不是主要缺點了。 我之所以強調“如果”一詞是因為,通常,Web 應用程序一旦進行了部署,用戶就會發現他們需要附加的功能,例如排序、分頁和編輯。
Repeater 有一個彌補性的品質(這并不令人吃驚),那就是性能。 Repeater 的性能比 DataList 的性能稍微好一點,比 DataGrid 的性能要好很多。圖 3 顯示了Repeater 每秒能處理的請求數,并與 DataGrid 和 DataList 進行了對比。