特點:無預設 HTML 結構、無 ViewState (若不啟用)、效能最佳、完全由模板控制輸出。適合:前台清單、導覽列、簡單報表。
| 模板 | 用途 | 備註 |
|---|---|---|
| HeaderTemplate | 表頭/清單開頭 | 渲染一次 |
| ItemTemplate | 每一筆資料 | 對應 foreach 迴圈主體 |
| AlternatingItemTemplate | 隔行樣式 | 若無則沿用 ItemTemplate |
| SeparatorTemplate | 項目間分隔 | 如 <hr/>、<tr class="sep"> |
| FooterTemplate | 表尾/清單結尾 | 渲染一次 |
<asp:ObjectDataSource ID="ods" runat="server"
TypeName="BLL.ClassService"
SelectMethod="GetClasses"
DeleteMethod="DeleteClass">
<DeleteParameters>
<asp:Parameter Name="classId" Type="Int32" />
</DeleteParameters>
</asp:ObjectDataSource>
<table id="tbList" class="table">
<asp:Repeater ID="rptClass" runat="server" DataSourceID="ods"
OnItemCommand="rptClass_ItemCommand">
<HeaderTemplate>
<thead><tr><th>ID</th><th>名稱</th><th>人數</th><th>圖片</th><th>操作</th></tr></thead><tbody>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td><%# Eval("ClassId") %></td>
<td><asp:TextBox runat="server" Text='<%# Eval("ClassName") %>' ReadOnly="true" /></td>
<td><%# Eval("StudentCount") %></td>
<td>
<asp:Image runat="server" ImageUrl='<%# "images/" + Eval("ImageUrl") %>' Width="80" />
</td>
<td>
<asp:LinkButton runat="server" CommandName="Delete"
CommandArgument='<%# Eval("ClassId") %>'
OnClientClick="return confirm('確定刪除?');">刪除</asp:LinkButton>
</td>
</tr>
</ItemTemplate>
<AlternatingItemTemplate>
<tr class="alt-row">
<td><%# Eval("ClassId") %></td>
<td><asp:TextBox runat="server" Text='<%# Eval("ClassName") %>' ReadOnly="true" /></td>
<td><%# Eval("StudentCount") %></td>
<td><asp:Image runat="server" ImageUrl='<%# "images/" + Eval("ImageUrl") %>' Width="80" /></td>
<td>
<asp:LinkButton runat="server" CommandName="Delete"
CommandArgument='<%# Eval("ClassId") %>'
OnClientClick="return confirm('確定刪除?');">刪除</asp:LinkButton>
</td>
</tr>
</AlternatingItemTemplate>
<SeparatorTemplate><tr><td colspan="5"><hr/></td></tr></SeparatorTemplate>
<FooterTemplate></tbody><tfoot><tr><td colspan="5">資料結束</td></tr></tfoot></FooterTemplate>
</asp:Repeater>
</table>
protected void rptClass_ItemCommand(object source, RepeaterCommandEventArgs e)
{
if (e.CommandName == "Delete")
{
int classId = Convert.ToInt32(e.CommandArgument);
if (new BLL.ClassService().DeleteClass(classId))
{
rptClass.DataBind(); // 重新繫結更新畫面
// 或 ScriptManager.RegisterStartupScript(this, GetType(), "", "alert('刪除成功');", true);
}
}
}
ListView = Repeater + 編輯/插入/刪除/分頁/選取 模板整合。Visual Studio 智慧標籤「設定 ListView」可自動產生所有模板。
| 模板 | 對應功能 | 必要條件 |
|---|---|---|
| LayoutTemplate | 整體版面 (含表頭/表尾) | 必須包含 ID="itemPlaceholder" 的容器 (Panel/PlaceHolder/tr) |
| ItemTemplate | 一般資料列 | — |
| AlternatingItemTemplate | 隔行樣式 | — |
| EditItemTemplate | 編輯模式列 | CommandName="Edit"/"Update"/"Cancel" |
| InsertItemTemplate | 新增模式列 | InsertItemPosition="FirstItem/LastItem" |
| SelectedItemTemplate | 選取列樣式 | CommandName="Select" |
| EmptyDataTemplate | 無資料時顯示 | — |
預設 EnablePaging="true" 會撈全表再切頁,大數據效能極差。正確做法:
EnablePaging="true"、SelectCountMethod、MaximumRowsParameterName、StartRowIndexParameterName。GetPageList(pageSize, startRowIndex) 與 GetTotalCount()。ROW_NUMBER() OVER (ORDER BY ...) 分頁查詢 (SQL Server 2012+ 可用 OFFSET/FETCH)。
<asp:ObjectDataSource ID="ods" runat="server"
TypeName="BLL.ClassService"
SelectMethod="GetPageList"
SelectCountMethod="GetTotalCount"
EnablePaging="true"
MaximumRowsParameterName="pageSize"
StartRowIndexParameterName="startRowIndex"
DeleteMethod="DeleteClass"
UpdateMethod="UpdateClass"
InsertMethod="AddClass"
DataObjectTypeName="MODEL.ClassInfo">
</asp:ObjectDataSource>
public List GetPageList(int pageSize, int startRowIndex)
{
return new DAL.ClassRepository().GetPageList(pageSize, startRowIndex);
}
public int GetTotalCount()
{
return new DAL.ClassRepository().GetTotalCount();
}
<asp:DataPager ID="dpClass" runat="server" PagedControlID="lvClass" PageSize="10">
<Fields>
<asp:NextPreviousPagerField FirstPageText="首頁" LastPageText="尾頁"
NextPageText="下一頁" PreviousPageText="上一頁" ButtonType="Button" />
<asp:NumericPagerField ButtonCount="5" />
</Fields>
</asp:DataPager>
| 需求 | 推薦控制項 | 理由 |
|---|---|---|
| 唯讀清單、極致效能、自訂 HTML | Repeater | 最輕量、無 ViewState 壓力 |
| 需內建編輯/新增/刪除/分頁/選取 | ListView | 模板完整、聲明式 CRUD |
| 簡單表格、需雙向繫結、自動欄產生 | GridView | 開發最快、但 HTML 膨脹 |
| 單筆資料詳細檢視/編輯 | DetailsView / FormView | 單筆導向 |
新專案建議採用 WebAPI + 前端框架 (Vue/React/Blazor),後端只回傳 JSON,前端負責渲染與互動,徹底解決 ViewState、PostBack、控制項生命週期等傳統 WebForms 痛點。