三層架構設計
- 框架無關層:
fsDevCommon.CheckValidValue — 純邏輯,無 Web 依賴
- Web 交互層:驗證控件、錯誤提示、客戶端腳本生成
- 頁面調用層:聲明式配置、統一入口驗證
核心驗證引擎(節選)
public bool CheckValidValue(string strValue, string strTypeFormat) {
if (string.IsNullOrEmpty(strTypeFormat)) return true;
// D: 日期 T: 日期時間 N: 整數 F: 浮點 C: 字符串/枚舉
char type = char.ToUpper(strTypeFormat[0]);
var parts = strTypeFormat.Split(',');
string op = parts.Length > 1 ? parts[1].Trim() : "=";
string min = parts.Length > 2 ? parts[2] : null;
string max = parts.Length > 3 ? parts[3] : null;
switch (type) {
case 'D': return ValidateDate(strValue, op, min, max);
case 'T': return ValidateDateTime(strValue, op, min, max);
case 'N': return ValidateInt(strValue, op, min, max);
case 'F': return ValidateDouble(strValue, op, min, max);
case 'C': return ValidateString(strValue, op, min, max);
default: return true;
}
}
// 格式示例:"D,>=,2020-01-01" 日期不早於2020年
// "N,BETWEEN,1,100" 整數在1-100之間
// "C,IN,OptionA,OptionB|OptionC" 字符串在枚舉範圍內
SQL 注入防護內建
private static readonly Regex SqlInjectionPattern = new Regex(
@"(\b(SELECT|INSERT|UPDATE|DELETE|DROP|UNION|EXEC)\b)|(--|;|/\*|\*/|'|""|%27|%22)",
RegexOptions.IgnoreCase | RegexOptions.Compiled);
public bool CheckSqlSafe(string input) => !SqlInjectionPattern.IsMatch(input);
Web 層聲明式使用
<asp:TextBox ID="txtAge" runat="server"
ValidateFormat="N,BETWEEN,1,120"
ErrorMessage="年齡必須在1-120之間" />
<asp:TextBox ID="txtEmail" runat="server"
ValidateFormat="C,REGEX,^\w+@\w+\.\w+$"
ErrorMessage="郵箱格式不正確" />
// 頁面統一驗證
protected void btnSubmit_Click(object sender, EventArgs e) {
if (!ValidationHelper.ValidatePage(this)) return;
// 業務邏輯...
}