ASP.NET MVC 2 引入了強大的內建驗證框架,讓開發者只需透過屬性標註模型屬性,即可自動實現伺服器端與用戶端的雙重驗證。這對於習慣在 MVC 1.0 時代手寫驗證邏輯、自訂模型繫結器的開發者而言,無疑是巨大的福音。本文將深入探討這項新功能的核心機制與實際應用。
回顧 ASP.NET WebForms 時代,驗證邏輯透過伺服器控件(如 RequiredFieldValidator)以宣告式方式寫在頁面上。這些控件封裝了客戶端 JavaScript 與伺服器端邏輯,確保驗證規則在前後端同步,且不產生維護負擔。範例程式碼如下:
<form id="form1" runat="server">
<asp:TextBox runat="server" ID="_userName" />
<asp:RequiredFieldValidator runat="server" ControlToValidate="_userName"
ErrorMessage="Please enter a username" />
<asp:Button runat="server" ID="_submit" Text="Submit" />
</form>
然而,在 MVC 架構下,視圖不應包含商業邏輯,直接使用 WebForms 驗證控件違背了關注點分離原則。MVC 2 的模型驗證機制正是為了解決這個痛點而生。
在 MVC 中,模型扮演資料容器角色,自然成為定義驗證規則與約束的理想位置。以預設專案範本中的 RegisterModel 為例:
public class RegisterModel
{
public string UserName { get; set; }
public string Email { get; set; }
public string Password { get; set; }
public string ConfirmPassword { get; set; }
}
對應的控制器動作:
[HttpPost]
public ActionResult Register(RegisterModel model)
{
// 處理註冊邏輯
}
透過 System.ComponentModel.DataAnnotations 命名空間下的屬性(如 [Required]、[StringLength]、[RegularExpression] 等),即可在模型層級宣告驗證規則,框架會自動在模型繫結階段執行驗證,並將錯誤訊息加入 ModelState,視圖端透過 Html.ValidationMessageFor 顯示。
MVC 2 同步引入了模型元數據系統,透過 ModelMetadata 與 ModelMetadataProvider,開發者可自訂顯示名稱、資料格式、編輯範本等行為,配合 EditorFor、DisplayFor 等助手方法,實現高度可復用的 UI 渲染邏輯。這為建立一致性的企業級應用奠定了基礎。
ASP.NET MVC 2 的模型驗證與元數據機制,將驗證邏輯從控制器與視圖中剝離,集中於模型層,符合單一職責原則,並自動處理前後端同步,大幅提升開發效率與程式碼可維護性。這是 MVC 框架邁向成熟的關鍵里程碑。