WebGrid 幫助器消除手寫 HTML 表格的繁瑣,提供內建分頁、排序、格式化功能,以極少程式碼產出專業級資料表格。
@{
var db = Database.Open("SmallBakery");
var selectQueryString = "SELECT * FROM Product ORDER BY Name";
}
<html><body>
<h1>Small Bakery Products</h1>
<table>
<tr><th>Id</th><th>Product</th><th>Description</th><th>Price</th></tr>
@foreach (var row in db.Query(selectQueryString)) {
<tr>
<td>@row.Id</td>
<td>@row.Name</td>
<td>@row.Description</td>
<td align="right">@row.Price</td>
</tr>
}
</table>
</body></html>
缺點: 重複樣板程式碼、無分頁導致效能問題、無排序功能、格式化邏輯分散、維護困難。
@{
var db = Database.Open("SmallBakery");
var data = db.Query("SELECT * FROM Product ORDER BY Id");
var grid = new WebGrid(data);
}
<html><head><title>WebGrid Demo</title></head><body>
<h1>Small Bakery Products</h1>
<div id="grid">
@grid.GetHtml()
</div>
</body></html>
@{
var db = Database.Open("SmallBakery");
var data = db.Query("SELECT * FROM Product");
var grid = new WebGrid(
source: data,
defaultSort: "Name", // 預設排序欄位
rowsPerPage: 10, // 每頁筆數
canPage: true, // 啟用分頁
canSort: true, // 啟用排序
ajaxUpdateContainerId: "grid", // AJAX 更新容器 ID
ajaxUpdateCallback: "onGridUpdate" // AJAX 回呼函數
);
}
<div id="grid">
@grid.GetHtml(
tableStyle: "table table-striped table-bordered", // Bootstrap 樣式類別
headerStyle: "thead-dark",
footerStyle: "tfoot-light",
rowStyle: "tbody-row",
alternatingRowStyle: "alt-row",
selectedRowStyle: "selected-row",
mode: WebGridPagerModes.All, // 分頁模式: All, NextPrevious, FirstLast, Numeric
firstText: "<< 首頁",
previousText: "< 上頁",
nextText: "下頁 >",
lastText: "末頁 >>",
numericLinksCount: 5, // 數字連結顯示數量
columns: grid.Columns(
grid.Column("Id", "編號", style: "col-id", canSort: true),
grid.Column("Name", "產品名稱", style: "col-name"),
grid.Column("Description", "說明", style: "col-desc"),
grid.Column("Price", "價格",
format: @<text>@item.Price.ToString("C")</text>, // 貨幣格式化
style: "col-price text-right"
),
grid.Column("", "操作",
format: @<a href="@Href("~/Edit/@item.Id")">編輯</a> |
<a href="@Href("~/Delete/@item.Id")" class="delete">刪除</a>,
style: "col-action"
)
)
)
</div>
| Column 方法參數 | 描述 | 範例 |
|---|---|---|
| columnName | 資料來源欄位名稱 | "Price" |
| header | 表頭顯示文字 | "價格" |
| format | Razor 樣板委派,@item 存取資料列 | @<text>@item.Price.ToString("C")</text> |
| style | TD CSS 類別 | "text-right" |
| canSort | 是否允許排序 | true/false |
<script src="~/Scripts/jquery-3.6.0.min.js"></script>
<script src="~/Scripts/jquery.unobtrusive-ajax.min.js"></script>
@{
var grid = new WebGrid(data, ajaxUpdateContainerId: "grid");
}
<div id="grid">
@grid.GetHtml(...)
</div>
<script>
function onGridUpdate() {
console.log("Grid updated via AJAX");
// 可在此重新綁定事件、觸發動畫等
}
</script>
OFFSET/FETCH (SQL Server 2012+) 或 ROW_NUMBER() 僅查詢當頁資料,避免全表載入記憶體WebCache.Set("products_grid", grid, 300)新專案建議採用前端表格庫分離關注點:
後端僅提供 Web API (JSON),前端負責渲染、分頁、排序、篩選、編輯。