在講解 MVC Token 時簡略提及 LINQ 實體的業務驗證,本文詳細闡述如何在 LINQ 生成的實體類中正確實現資料驗證與過濾。
[Column(Storage="_userMail", DbType="VarChar(100)")]
public string userMail {
get { return this._userMail; }
set {
if (this._userMail != value) {
this.OnuserMailChanging(value); // 關鍵擴展點
this.SendPropertyChanging();
this._userMail = value;
this.SendPropertyChanged("userMail");
this.OnuserMailChanged(); // 關鍵擴展點
}
}
}
Setter 中先呼叫 OnuserMailChanging(value),這是我們植入業務邏輯判斷的最佳時機。
partial void OnuserMailChanging(string value) {
Regex reg = new Regex(@"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*");
if (!reg.IsMatch(value)) {
throw new ArgumentException("format error!");
}
}
若格式錯誤直接拋出異常,賦值操作將被中止,實現前置驗證。
若嘗試在 Changing 中過濾 HTML 字符:
partial void OnuserMailChanging(string value) {
_userMail = FilterContent(_userMail); // 錯誤示範
}
原因有二:
value 修改不影響實參。value 賦給 _userMail,覆蓋先前修改。修改 Designer 代碼移除後續賦值不可取,因 Designer 代碼會被重新生成覆蓋。
將過濾邏輯放入 OnuserMailChanged,此時賦值已完成,修改字段值有效:
partial void OnuserMailChanged() {
_userMail = FilterContent(_userMail);
}
結合策略:
OnChanging:格式驗證、業務規則檢查,失敗拋異常阻止賦值。OnChanged:內容過濾、格式化、衍生屬性計算等後置處理。如此結合,實體才能兼具健壯性與整潔性!