ASP.NET MVC 內建 HTML Helper 雖具彈性,但手寫表格、上傳等重複 UI 代碼耗時且易出錯。本文介紹兩個成熟第三方控件:MvcContrib Grid(資料表格渲染)與 SlickUpload(檔案上傳),大幅提升開發效率。
<table>
<tr><th>Username</th><th>First name</th><th>Last name</th><th>Email</th></tr>
<% foreach (var profile in Model) { %>
<tr>
<td><%= Html.Encode(profile.Username) %></td>
<td><%= Html.Encode(profile.FirstName) %></td>
<td><%= Html.Encode(profile.LastName) %></td>
<td><%= Html.Encode(profile.Email) %></td>
<td><%= Html.ActionLink("View", "Show", new { username = profile.Username }) %></td>
</tr>
<% } %>
</table>
<%= Html.Grid(Model).AutoGenerateColumns() %>
自動反射模型屬性產生欄位,適合快速原型。
<h2>產品列表</h2>
<%= Html.Grid(Model).Columns(column => {
column.For(x => x.ProductID).Named("產品編號");
column.For(x => x.ProductName).Named("產品名稱");
column.For(x => x.QuantityPerUnit).Named("單位數量");
column.For(x => x.UnitPrice).Named("單價").Format("{0:N2}");
column.For(x => Html.ActionLink("檢視", "Detail", new { id = x.ProductID }))
.Named("操作").DoNotEncode();
}) %>

.Sortable() + Controller 處理 sort、sortDir 參數.Paginate() + IPagination 模型.Filterable() 自動產生欄位篩選 UIpublic ActionResult Index(int? page, string sort, string sortDir)
{
var query = _productService.GetAll();
// 排序
if (!string.IsNullOrEmpty(sort))
query = sortDir == "DESC" ? query.OrderByDescending(sort) : query.OrderBy(sort);
// 分頁
var pagedList = query.AsPagination(page ?? 1, 20);
return View(pagedList);
}
Install-Package SlickUploadweb.config 註冊 HttpModule:<system.webServer>
<modules>
<add name="SlickUpload" type="SlickUpload.HttpModule, SlickUpload" />
</modules>
</system.webServer>
<slickUpload>
<uploadHandler type="SlickUpload.DatabaseUploadHandler, SlickUpload"
connectionStringName="DefaultConnection"
tableName="Uploads" />
</slickUpload>
<%= Html.SlickUpload().Multiple(true).ProgressBar(true).Queue(true) %>
public class CustomUploadHandler : UploadHandler
{
protected override void ProcessFile(UploadFile file)
{
// 儲存至雲端儲存、資料庫、觸發工作流等
var blob = _blobContainer.GetBlockBlobReference(file.FileName);
blob.UploadFromStream(file.InputStream);
// 記錄元資料
_db.UploadRecords.Add(new UploadRecord
{
FileName = file.FileName,
Size = file.Size,
ContentType = file.ContentType,
BlobUrl = blob.Uri.ToString()
});
_db.SaveChanges();
}
}
| 維度 | MvcContrib Grid | SlickUpload |
|---|---|---|
| 核心解決問題 | 資料表格渲染重複代碼 | 大檔案上傳體驗與伺服器壓力 |
| 學習曲線 | 低(Lambda 語法直觀) | 中(需理解 HttpModule 流程) |
| 擴充性 | 高(擴充方法、自訂欄位渲染) | 高(自訂 UploadHandler、事件鉤子) |
| 相依性 | 僅 System.Web.Mvc | 需註冊 HttpModule、Flash/HTML5 瀏覽器支援 |
| 維護狀態 | 社群維護,MVC 5+ 相容 | 商業/開源雙軌,持續更新 |
GridModel<T> 檢視模型,分離領域模型與顯示邏輯Bootstrap CSS 類別(.table .table-striped)獲得現代化外觀maxRequestLength、maxAllowedContentLength、請求逾時ProcessFile 初期善用 MvcContrib Grid 消除表格渲染樣板代碼,採用 SlickUpload 解決大檔案上傳痛點,能讓 MVC 開發團隊專注於核心業務邏輯,而非重複造 UI 輪子。兩者成熟度高、文件完善,是企業級 MVC 專案的優質選擇。