|
簡(jiǎn)介
自從出現(xiàn)了像 Microsoft Active Server Pages (ASP) 這樣的簡(jiǎn)單且基于腳本的 Web 編程技術(shù)以來,Web 開發(fā)又有了很大的發(fā)展。 傳統(tǒng) ASP 中常見的大量枯燥、重復(fù)的編碼工作,在 Microsoft ASP.NET 中不復(fù)存在了。 例如,正如所有傳統(tǒng) ASP 開發(fā)人員一度都知道的那樣,在傳統(tǒng) ASP Web 頁面中顯示數(shù)據(jù)需要下面的偽代碼:
Create connection to the database
Populate an ADO Recordset with a SQL query
Display any header HTML needed
For Each Record in the Recordset
Print out the Recordset field(s) and associated HTML
Move to the next record
Next
Display any footer HTML needed
例如,要在 HTML <table> 中顯示記錄集的內(nèi)容,開發(fā)人員則不得不為 <table> 標(biāo)記 (tag) 生成 HTML 標(biāo)記 (markup),然后循環(huán)遍歷記錄集中的每一條記錄,每次循環(huán)生成一個(gè) <tr> 標(biāo)記,以及許多 <td> 標(biāo)記和要顯示的記錄集字段的值。 最后,在循環(huán)之后,開發(fā)人員需要生成結(jié)束 <table> 標(biāo)記。
傳統(tǒng) ASP 所要求的這種方法有一個(gè)很大的缺點(diǎn): 它把 HTML 內(nèi)容和 ASP Web 頁面的源代碼緊密集成在一起。 因?yàn)闆]有分離代碼和 HTML 內(nèi)容,所以更改 HTML 的內(nèi)容及其困難,尤其是對(duì)不懂編程技術(shù)的圖形藝術(shù)家或 Web 設(shè)計(jì)者來說更是如此。 而且,因?yàn)闄z索數(shù)據(jù)庫結(jié)果和生成它的內(nèi)容都需要代碼,所以代碼和 HTML 內(nèi)容的這種集成相對(duì)來說需要大量的代碼。
幸好,ASP.NET 提供了三個(gè)控件,使得在 ASP.NET Web 頁面中顯示數(shù)據(jù)絕對(duì)比傳統(tǒng) ASP 所需的迭代方式簡(jiǎn)單得多。 這三個(gè)控件是 DataGrid、DataList 和 Repeater,以后我將稱之為數(shù)據(jù) Web 控件。 也許,如果您已經(jīng)開發(fā)過 ASP.NET Web 頁面,那么至少會(huì)對(duì)這三個(gè)控件中的一個(gè)有一些經(jīng)驗(yàn)。 通常,開發(fā)人員從學(xué)習(xí) DataGrid 開始,這是因?yàn)?nbsp;DataGrid 使用簡(jiǎn)單以及它具有允許數(shù)據(jù)排序、分頁和編輯的功能。 但是,在 ASP.NET Web 頁面中顯示數(shù)據(jù)時(shí),DataGrid 并不總是控件的最佳選擇。
在本文中,我們將研究這些數(shù)據(jù) Web 控件中每個(gè)控件的獨(dú)特特性。 這些特性賦予每個(gè)數(shù)據(jù) Web 控件許多優(yōu)點(diǎn)和缺點(diǎn)。 因?yàn)槊恳粋€(gè)數(shù)據(jù) Web 控件都有一些缺點(diǎn),所以沒有可用于任何作業(yè)的“完美”控件。 決定使用哪個(gè)控件時(shí),必須權(quán)衡這三個(gè)數(shù)據(jù) Web 控件每一個(gè)的優(yōu)點(diǎn)和缺點(diǎn),然后再?zèng)Q定哪個(gè)控件是最合適的。
為了協(xié)助進(jìn)行比較,研究每一個(gè)數(shù)據(jù) Web 控件時(shí),我們將著重于這三個(gè)衡量標(biāo)準(zhǔn): 可用性(從 Web 訪問者的角度)、開發(fā)時(shí)間和性能。 我們首先快速瀏覽一下這三個(gè)數(shù)據(jù) Web 控件之間的相似性。 接下來我們將深入研究 DataGrid,然后研究 DataList,最后查看 Repeater。 對(duì)于每一個(gè)控件,我們將研究這些控件的功能,并討論它的功能集是如何影響這些衡量標(biāo)準(zhǔn)的。
返回頁首
數(shù)據(jù) Web 控件之間的相似性
在研究數(shù)據(jù) Web 控件之間的差異(這些差異使它們區(qū)別于其他控件)之前,先看一下它們的相似性。 從較高級(jí)別觀點(diǎn)來看,最基本的相似性是,DataGrid、DataList 和 Repeater都設(shè)計(jì)為了執(zhí)行大致相同的操作: 顯示數(shù)據(jù)。 另一個(gè)相似性把數(shù)據(jù)綁定到數(shù)據(jù) Web 控件所需的代碼。 具體地說,只需要下面兩行代碼:
dataWebControlID.DataSource = someDataSource
dataWebControlID.DataBind()
通常,賦給數(shù)據(jù) Web 控件的 DataSource 屬性的 someDataSource 對(duì)象是一個(gè) DataSet、SqlDataReader、OleDbDataReader 或一個(gè)集合(如 Array、ArrayList 或 System.Collections 命名空間中的其他某個(gè)類)。 但是,任何實(shí)現(xiàn) IEnumerable 接口的對(duì)象都可以綁定到數(shù)據(jù) Web 控件。
DataBind() 方法枚舉指定的 DataSource 中的記錄。 對(duì)于 DataSource 中的每一條記錄,都會(huì)創(chuàng)建一個(gè)項(xiàng)并追加到數(shù)據(jù) Web 控件的 Items 集合中。 數(shù)據(jù) Web 控件中的每一項(xiàng)都是一個(gè)類實(shí)例。 用于控件每一項(xiàng)的特定類取決于該數(shù)據(jù) Web 控件。 例如,DataGrid 中的每一項(xiàng)都是 DataGridItem 類的一個(gè)實(shí)例,而 Repeater 中的每一項(xiàng)都是 RepeaterItem 類的一個(gè)實(shí)例。
每個(gè)數(shù)據(jù) Web 控件會(huì)為它的每一項(xiàng)使用不同的類,因?yàn)槭沁@些項(xiàng)呈現(xiàn)的方式?jīng)Q定了數(shù)據(jù) Web 控件生成的 HTML 標(biāo)記。 例如,DataGridItem 類是從 TableRow 類中派生的,這意味著每個(gè) DataGridItem 都或多或少地呈現(xiàn)為一個(gè)表行。 這很有意義,因?yàn)?nbsp;DataGrid 設(shè)計(jì)為在 HTML <table> 標(biāo)記內(nèi)以表格形式顯示數(shù)據(jù),在 HTML <table> 中,每一項(xiàng)都呈現(xiàn)為單獨(dú)一行。 另一方面,Repeater 設(shè)計(jì)為允許對(duì)它的輸出進(jìn)行完全自定義。 因此,RepeaterItem 類不從 TableRow 類中派生并不令人驚訝。
數(shù)據(jù) Web 控件之間的另一個(gè)相似性是每個(gè)控件都能使用模板提供高度自定義的輸出。 DataList 和 Repeater 控件必須 使用模板指定它們的內(nèi)容,而 DataGrid 則通過 TemplateColumn 列類型可以為特定的列選擇使用模板(我們將在下一節(jié)“研究 DataGrid Web 控件”中討論各種不同的 DataGrid 列類型)。
最后一個(gè)值得注意的是 DataGrid 和 DataList 控件是從 WebControl 類中派生的,而 Repeater 控件是從 Control 類中派生的。 WebControl 類包含許多美學(xué)方面的屬性,例如 BackColor、ForeColor、CssClass、BorderStyle 等。 這意味著如果使用 DataGrid 和 DataList,就可以通過它們從 WebControl 類中繼承的屬性指定樣式設(shè)置。 而 Repeater 沒有任何這樣的樣式屬性。 正如我們將在“深入研究 Repeater”一節(jié)中所討論的一樣,對(duì) Repeater 輸出的任何可視設(shè)置都必須在 Repeater 的模板中指定。
返回頁首
研究 DataGrid Web 控件
DataGrid Web 控件是這三個(gè)數(shù)據(jù) Web 控件中功能最多的,但是在自定義控件生成的實(shí)際 HTML 標(biāo)記時(shí),它又是最不靈活的。 呈現(xiàn)的 HTML 標(biāo)記中的這種不靈活性,是由于 DataGrid 是設(shè)計(jì)用于使用 HTML <table> 以表格形式顯示數(shù)據(jù)所造成的。 因此,對(duì)于每一條綁定到 DataGrid 的記錄,都會(huì)創(chuàng)建一個(gè)單獨(dú)的表行(<tr>),對(duì)于要顯示的記錄中的每一個(gè)字段,都會(huì)創(chuàng)建一個(gè)單獨(dú)的表列(<td>)。
DataGrid 提供了許多功能,可極大地提高要顯示的數(shù)據(jù)的可用性。 例如,把 DataGrid 的 AllowSorting 屬性設(shè)置為 True 并添加一點(diǎn)源代碼,開發(fā)人員就可以把一個(gè)普通的 DataGrid 變成一個(gè)其數(shù)據(jù)可以由最終用戶排序的 DataGrid。 另外,再增加一點(diǎn)工作量,開發(fā)人員就能增強(qiáng) DataGrid 的功能以允許數(shù)據(jù)分頁或數(shù)據(jù)的內(nèi)聯(lián)編輯。 這些功能明顯增強(qiáng)了 DataGrid 的可用性。
除了在可用性方面得分很高,DataGrid 還提供了很短的開發(fā)時(shí)間。 要使用 DataGrid 開始在 ASP.NET Web 頁面中顯示數(shù)據(jù),只需要把 DataGrid 添加到 Web 頁面中并編寫兩行必要的代碼: 第一行把數(shù)據(jù)綁定到 DataGrid 的 DataSource,第二行調(diào)用 DataGrid 的 DataBind() 方法。 顯然,隨著添加到 DataGrid 中的功能數(shù)量的增加,開發(fā)時(shí)間也增加了,但這只是把開發(fā)時(shí)間和其他數(shù)據(jù) Web 控件進(jìn)行比較。 假設(shè)您要允許對(duì) Repeater 顯示的數(shù)據(jù)進(jìn)行排序。 添加這樣的功能是一定可能的,但是與用 DataGrid 完成同樣的操作相比,這需要明顯多很多的時(shí)間和精力。
盡管 DataGrid 具有良好的可用性和開發(fā)時(shí)間得分,但是這個(gè)控件有兩個(gè)固有的缺點(diǎn)。 第一,正如前面所談到的,DataGrid 在對(duì)所呈現(xiàn)的 HTML 標(biāo)記進(jìn)行自定義方面的功能很有限。 是的,您可以自定義 DataGrid 的不同行和列的字體、顏色和邊框,但是事實(shí)仍然是,當(dāng) DataGrid 顯示數(shù)據(jù)時(shí),結(jié)果將是一個(gè) HTML <table>,DataSource 中的每一條記錄都對(duì)應(yīng)其中一個(gè) <tr>,每一個(gè)字段都對(duì)應(yīng)其中一個(gè) <td>。
具體地說,DataGrid 中的每一列都是一個(gè)從 DataGridColumn 類中派生的類實(shí)例。 有五個(gè)內(nèi)置的 DataGrid 列類型:
• BoundColumn
• ButtonColumn
• EditColumn
• HyperLinkColumn
• TemplateColumn
每一個(gè)列類型都提供數(shù)據(jù)或提供某種允許用戶和 DataGrid 進(jìn)行交互的接口。 例如,BoundColumn 以純文本顯示 DataSource 字段的值,而 HyperLinkColumn 則會(huì)顯示一個(gè)超級(jí)鏈接,其文字和 URL 部分可能是 DataSource 字段。 除了這些內(nèi)置的列類型,通過創(chuàng)建 DataGridColumn 類的派生類,還可以創(chuàng)建自定義 DataGrid 列類型。 (有關(guān)創(chuàng)建一個(gè)用于擴(kuò)展 BoundColumn 功能以限制顯示字符數(shù)的列的示例,請(qǐng)參閱 Creating a Custom DataGridColumn Class。)
有了這么多的 DataGrid 列類型,可能就不理解為什么 DataGrid 呈現(xiàn)的 HTML 標(biāo)記不能進(jìn)行高度自定義了。 要知道,雖然每一個(gè) DataGrid 列類型在呈現(xiàn)時(shí)生成不同的 HTML,但是每一列都包含在一組 <td> 標(biāo)記中,每一行都包含在一組 <tr> 標(biāo)記中。 因此,即使可以用 TemplateColumn 自定義每一行的特定列的 HTML 輸出,而 DataGrid 仍然呈現(xiàn)為 HTML <table>,其中每一行使用一個(gè) <tr>,每一列使用一個(gè) <td> 。 DataGrid 的這種限制禁止了更多具有創(chuàng)造性的數(shù)據(jù)顯示。 例如,如果要在每一表行中顯示五條記錄,就不能使用 DataGrid,必須使用DataList 或 Repeater。 另外,如果要在除 <table> 之外的 HTML 標(biāo)記中顯示數(shù)據(jù),很遺憾,就不能使用 DataGrid 了。
DataGrid 第二個(gè)缺點(diǎn)是它的性能。 DataGrid 是這三個(gè)數(shù)據(jù) Web 控件中性能最差的。 基于這一點(diǎn),由 DataGrid - 特別是具有許多行的 DataGrids - 產(chǎn)生的 ViewState 可能會(huì)非常大。 如果使用 DataGrid 僅僅是為了顯示數(shù)據(jù),則可以關(guān)閉 ViewState,但是,使用 DataGrid 的排序、分頁或編輯功能時(shí),就不能這樣做了。
為了測(cè)試 DataGrid 的性能,我使用了 Microsoft 的免費(fèi) Web Application Stress Tool (WAST)。 在本文最后的“基準(zhǔn)設(shè)置”一節(jié)中列出了精確的測(cè)試條件和 WAST 設(shè)置。 另外,測(cè)試使用的代碼也可在本文最后下載。
這個(gè) Web Application Stress Tool 會(huì)向 Web 服務(wù)器發(fā)出一組特定的 URL 請(qǐng)求。 對(duì)于每一項(xiàng)測(cè)試,我都在一分鐘之內(nèi)盡可能快地不斷請(qǐng)求一個(gè) URL。 WAST 報(bào)告了許多性能衡量標(biāo)準(zhǔn);我要關(guān)注的一個(gè)衡量標(biāo)準(zhǔn)是每秒請(qǐng)求數(shù),它表明了 Web 服務(wù)器每秒能執(zhí)行多少次 ASP.NET Web 頁面。
對(duì)于一個(gè)僅顯示數(shù)據(jù)的簡(jiǎn)單 DataGrid,運(yùn)行了兩個(gè)測(cè)試。 具體地說,DataGrid 顯示了來自 Northwinds 數(shù)據(jù)庫的 Customers 表(Customers 表總共包含 91 條記錄)的四個(gè)字段。 DataGrid 的 AutoGenerateColumns 屬性設(shè)置為 True。 第一項(xiàng)測(cè)試把 DataGrid 放在一個(gè) Web 窗體( <form runat="server">)中,而第二項(xiàng)測(cè)試則沒有。 如果在窗體中放置一個(gè)控件而不把它的 EnableViewState 屬性顯式設(shè)置為 False,那么該控件則會(huì)用 ViewState 保持它的狀態(tài)。 創(chuàng)建這個(gè) ViewState 項(xiàng)可能是一個(gè)比較費(fèi)時(shí)的過程,因此減少了可處理的總的每秒請(qǐng)求數(shù),結(jié)果如圖 1 所示。
圖 1: DataGrid 的每秒請(qǐng)求數(shù)
正如我們將要在研究 DataList 和 Repeater 時(shí)看到的一樣,這兩個(gè)控件都提供了比 DataGrid 更好的性能。
返回頁首
分析 DataList
記得 DataGrid 將呈現(xiàn)為 HTML <table>,每一個(gè) DataSource 記錄作為一個(gè)表行(<tr>),每一個(gè)記錄字段作為一個(gè)表列(<td>)。 有時(shí),您可能想更多地控制數(shù)據(jù)的顯示。 例如,您可能想把數(shù)據(jù)顯示在 HTML <table> 中,但不是每行顯示一條記錄,而是每行顯示五條記錄。 或者,您根本不想把數(shù)據(jù)顯示在 <table> 標(biāo)記中,而是想把每個(gè)元素顯示在一個(gè) <span> 標(biāo)記中。
DataList 放棄了 DataGrid 所采用的“列”概念。 相反,DataList 的顯示是通過模板 定義的。 利用模板,開發(fā)人員可以指定混合的 HTML 語法和數(shù)據(jù)綁定語法。 HTML 語法是標(biāo)準(zhǔn)的 HTML 標(biāo)記;數(shù)據(jù)綁定語法是使用 <%# 和 %> 標(biāo)記分隔的,用于從 DataSource 的記錄中產(chǎn)生用于構(gòu)造給定 DataList 項(xiàng)的內(nèi)容。 例如,下面的 ItemTemplate 將顯示 DataSource 的字段 CompanyName:
<ASP:DataList runat="server" id="myDataList">
<ItemTemplate>
<%# DataBinder.Eval(Container.DataItem, "CompanyName") %>
</ItemTemplate>
</ASP:DataList>
除了數(shù)據(jù)綁定語法,模板也可以包含 HTML 標(biāo)記。 通過更新上面的模板,可以使 CompanyName 字段以粗體顯示,而使 ContactName 字段以非粗體顯示在 CompanyName 字段的下面:
<ASP:DataList runat="server" id="myDataList">
<ItemTemplate>
<b><%# DataBinder.Eval(Container.DataItem, "CompanyName") %></b>
<br />
<%# DataBinder.Eval(Container.DataItem, "ContactName") %>
</ItemTemplate>
</ASP:DataList>
對(duì)于 DataList 的 DataSource 中的每一條記錄,都要計(jì)算 ItemTemplate 的數(shù)據(jù)綁定語法。 數(shù)據(jù)綁定語法的輸出與 HTML 標(biāo)記一起指定了為 DataList 項(xiàng)呈現(xiàn)的 HTML。 DataList 還支持其他六個(gè)模板,包括 ItemTemplate在內(nèi)共有如下七個(gè):
• AlternatingItemTemplate
• EditItemTemplate
• FooterTemplate
• HeaderTemplate
• ItemTemplate
• SelectedItemTemplate
• SeparatorTemplate
注意,DataGrid 的 TemplateColumn 僅支持四個(gè)模板: ItemTemplate、HeaderTemplate、FooterTemplate 和 EditItemTemplate。
默認(rèn)情況下,DataList 將每一項(xiàng)都顯示為 HTML <table> 中的一行。 但是,通過設(shè)置 RepeatColumns 屬性,您可以指定表的每一行顯示多少個(gè) DataList 項(xiàng)。 除了可以指定 HTML <table> 的每一行顯示多少個(gè) DataList 項(xiàng)之外,還可以指定 DataList 的內(nèi)容應(yīng)該使用 <span> 標(biāo)記顯示,而不是使用 <table> 標(biāo)記。 DataList 的 RepeatLayout 屬性可以設(shè)置為 Table 或 Flow,表示 DataList 中的數(shù)據(jù)呈現(xiàn)在 HTML <table> 中還是 <span> 標(biāo)記中。
利用模板以及 RepeatColumns 和 RepeatLayout 屬性,很明顯 DataList 比 DataGrid 允許對(duì)呈現(xiàn)的 HTML 標(biāo)記進(jìn)行更多的自定義。 這種增強(qiáng)了的自定義使得使用 DataList 能夠產(chǎn)生更為友好的數(shù)據(jù)顯示,因?yàn)?nbsp;DataGrid 的“每一條 DataSource 記錄占用一個(gè)表行的單 HTML <table>”模型不可能總是用于顯示信息的最佳選擇。 但是,只研究比 DataGrid 改進(jìn)了的自定義并不足以確定 DataList 的可用性;我們還必須比較 DataGrid 和 DataList 的排序、分頁和編輯功能。
使用 EditItemIndex 模板以及 EditCommand、UpdateCommand 和 CancelCommand 事件,DataList 可以支持內(nèi)聯(lián)編輯。 但是,用 DataList 添加這樣的功能比用 DataGrid 花費(fèi)的開發(fā)時(shí)間要長。 開發(fā)時(shí)間的差異是由于下面兩個(gè)原因:
• 通過 EditCommandColumn 列類型即可在 DataGrid 中創(chuàng)建的編輯/更新/取消按鈕,必須手動(dòng)添加到 DataList 中,以及
• DataGrid BoundColumn 列類型自動(dòng)使用 TextBox Web 控件作為編輯接口,而使用 DataList 時(shí)必須通過 EditItemTemplate 為要編輯的項(xiàng)顯式指定的編輯接口。
雖然用 DataList 進(jìn)行內(nèi)聯(lián)編輯不是很困難,但是 DataList 的數(shù)據(jù)排序、分頁和編輯卻很困難。 雖然一些靈活的編碼肯定能完成這樣的功能,但是向 DataList 中添加這樣的功能將花費(fèi)相當(dāng)多的開發(fā)時(shí)間。 因此,如果最終用戶能對(duì)數(shù)據(jù)進(jìn)行排序和分頁是一個(gè)必需要求的話,那么最好選擇 DataGrid 而不選擇 DataList。
DataList 的性能比 DataGrid 的性能好,當(dāng) DataList 位于 Web 窗體內(nèi)時(shí)這一點(diǎn)更明顯。 圖 2 顯示了 Web Application Stress Tool 在 DataList 上的測(cè)試結(jié)果。
圖 2: DataList 的每秒請(qǐng)求數(shù)
正如圖 2 中的結(jié)果顯示的那樣,當(dāng) DataList 放置在 Web 窗體內(nèi)時(shí)(因此導(dǎo)致該 Web 控件生成它的 ViewState),該 Web 控件要遠(yuǎn)勝于 DataGrid。
返回頁首
深入研究 Repeater
在所有這三個(gè)數(shù)據(jù) Web 控件中,Repeater Web 控件在呈現(xiàn)的 HTML 里提供了最大的靈活性。 DataGrid 或 DataList 會(huì)在預(yù)設(shè)的 HTML 標(biāo)記中自動(dòng)包含開發(fā)人員指定的內(nèi)容。與它們不同的是,Repeater 在呈現(xiàn)的時(shí)候?qū)?yán)格生成指定的 HTML 標(biāo)記。 因此,如果不想用 HTML <table>或者一系列 <span> 標(biāo)記顯示數(shù)據(jù),而希望以其他方式顯示數(shù)據(jù),就必須使用 Repeater 控件。
就像 DataList 一樣,使用 Repeater 時(shí)要用模板指定標(biāo)記。 Repeater 包含下列五個(gè)模板:
• AlternatingItemTemplate
• FooterTemplate
• HeaderTemplate
• ItemTemplate
• SeparatorTemplate
HeaderTemplate 和 FooterTemplate 指定出現(xiàn)在綁定到 Repeater 的數(shù)據(jù)之前和之后的 HTML 標(biāo)記。 AlternatingItemTemplate 和 ItemTemplate 指定用于呈現(xiàn) Repeater 的 DataSource 中的每條記錄的 HTML 標(biāo)記和數(shù)據(jù)綁定語法。 例如,假設(shè)您要把包含雇員信息的數(shù)據(jù)集綁定到 Repeater,該數(shù)據(jù)集的其中一個(gè)字段是 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 二者共有的樣式屬性。 這一點(diǎn)歸結(jié)起來無非是說,如果想對(duì) Repeater 中所顯示數(shù)據(jù)進(jìn)行格式設(shè)置,則必須在 HTML 標(biāo)記中進(jìn)行這樣的操作。 例如,在上面的例子中,如果想用粗體顯示雇員的姓名,則必須更改 ItemTemplate 以包含 HTML 粗體標(biāo)記,就像下面這樣:
<ItemTemplate>
<li><b><%# DataBinder.Eval(Container.DataItem, "EmployeeName")
%></b></li>
</ItemTemplate>
然而對(duì)于 DataGrid 或 DataList,通過把控件的 ItemStyle-Font-Bold 屬性設(shè)置為 True,就能用粗體顯示文本了。
Repeater 缺少樣式屬性會(huì)大大增加開發(fā)的時(shí)間指標(biāo)。 例如,假設(shè)決定使用 Repeater 顯示數(shù)據(jù),這些數(shù)據(jù)需要以粗體、中間對(duì)齊且?guī)в刑囟ū尘吧奶囟ㄗ煮w顯示。 所有這些都要用幾個(gè) HTML 標(biāo)記指定,這些標(biāo)記很快就會(huì)使 Repeater 的模板變得凌亂不堪。 這種凌亂會(huì)使以后對(duì)外觀進(jìn)行更改變得困難得多,尤其是當(dāng)其他人對(duì)該項(xiàng)目進(jìn)行操作時(shí),則不得不查看大量 HTML 語法。 將這一點(diǎn)與為 DataGrid 或 DataList 指定格式進(jìn)行比較。 對(duì)于這兩個(gè)控件中的任何一個(gè),都可以通過指定 DataGrid 或 DataList 的樣式屬性來使模板免于凌亂。 此外,可以用一些工具來自動(dòng)設(shè)置 DataGrid 和 DataList 的樣式屬性,例如 Microsoft Visual Studio .NET 或 ASP.NET Web Matrix。
除了延長開發(fā)時(shí)間之外,Repeater 還缺少有助于支持分頁、編輯或數(shù)據(jù)編輯的內(nèi)置功能。 由于缺少這些功能支持,Repeater 在可用性的評(píng)定中得分很低。 當(dāng)然,如果 所有您感興趣的只是顯示數(shù)據(jù),而不用帶任何別致的鈴聲或口哨聲,那么 Repeater 的功能匱乏就不是主要缺點(diǎn)了。 我之所以強(qiáng)調(diào)“如果”一詞是因?yàn)椋ǔ#琖eb 應(yīng)用程序一旦進(jìn)行了部署,用戶就會(huì)發(fā)現(xiàn)他們需要附加的功能,例如排序、分頁和編輯。
Repeater 有一個(gè)彌補(bǔ)性的品質(zhì)(這并不令人吃驚),那就是性能。 Repeater 的性能比 DataList 的性能稍微好一點(diǎn),比 DataGrid 的性能要好很多。圖 3 顯示了Repeater 每秒能處理的請(qǐng)求數(shù),并與 DataGrid 和 DataList 進(jìn)行了對(duì)比。
圖 3: Repeater 的每秒請(qǐng)求數(shù)
返回頁首
小結(jié)
在 ASP.NET Web 頁面中顯示數(shù)據(jù)時(shí),很多開發(fā)人員都選擇他們最熟悉的數(shù)據(jù) Web 控件,通常是 DataGrid。 但是這樣的盲目決定不夠明智,因?yàn)楦緵]有通用的“最好的”數(shù)據(jù) Web 控件。 決定為給定的 Web 頁使用哪個(gè)數(shù)據(jù) Web 控件時(shí),應(yīng)該先就以下各種問題自己考慮一下,以確定哪個(gè)控件最適合手邊的任務(wù)。 您想允許用戶對(duì)數(shù)據(jù)進(jìn)行排序嗎? 需要把數(shù)據(jù)用非 HTML <table> 的格式顯示嗎? 頁面會(huì)被大量訪問嗎,因而性能是一個(gè)關(guān)鍵的問題嗎?
因?yàn)?nbsp;DataGrid 能允許最終用戶排序、分頁和編輯它的數(shù)據(jù),所以這三個(gè)數(shù)據(jù) Web 控件中 DataGrid Web 控件提供了最好的功能集。 因?yàn)槭褂?nbsp;DataGrid 時(shí)只需要把它添加到 Web 頁面中并寫幾行代碼,所以 DataGrid 也是最簡(jiǎn)單易用的數(shù)據(jù) Web 控件。 但是,容易使用和強(qiáng)大的功能是要付出代價(jià)的,如性能的代價(jià): DataGrid 是三個(gè)數(shù)據(jù) Web 控件中效率最低的,特別是當(dāng)把它放置在 Web 窗體中時(shí)。
通過使用模板,DataList 對(duì)顯示的數(shù)據(jù)外觀提供了比 DataGrid 更多的控制。 但是,使用模板通常比使用 DataGrid 的列類型需要更多的開發(fā)時(shí)間 DataList 還支持?jǐn)?shù)據(jù)的內(nèi)聯(lián)編輯,但是實(shí)現(xiàn)起來需要的工作量比 DataGrid 多。 遺憾的是,在 DataList 中提供分頁和排序支持不是一件簡(jiǎn)單的事。 DataList 比 DataGrid 提供了更好的性能,從而彌補(bǔ)了這些缺少的內(nèi)置功能。
最后,Repeater 控件允許對(duì)呈現(xiàn)的 HTML 標(biāo)記進(jìn)行完整和全面的控制。 對(duì)于 Repeater,生成的唯一 HTML 是模板中數(shù)據(jù)綁定語句的值和模板中指定的 HTML 標(biāo)記,而不會(huì)生成象 DataGrid 和 DataList 那樣的“額外”HTML。 由于要求開發(fā)人員指定完整生成的 HTML 標(biāo)記,所以通常 Repeater 需要的開發(fā)時(shí)間最長。 而且,Repeater 不提供內(nèi)置編輯、排序或分頁支持。 但是,Repeater 的性能確實(shí)是這三個(gè)數(shù)據(jù) Web 控件中最好的。 它的性能可與 DataList 相比,但明顯比 DataGrid 好。
祝大家編程愉快!
AspNet技術(shù):決定何時(shí)使用 DataGrid、DataList 或 Repeater(ASP.NET 技術(shù)文章),轉(zhuǎn)載需保留來源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。