資訊工程開發時,有一項非常重要的學問,就是資料驗證。因為資料在傳輸的過程中,難免會有有心人士的惡意動作,隨意的存取資科,這時候開發者就作出保護資料的演譯。早期的開發驗證技術都是開發者自行撰寫,不過現今的程式語言,強大如微軟,內建的函式庫都有非常豐富的驗證元件供開發者使用。不過開發者也能自行撰寫所需要的驗證程式,大部分會用的的技術,就是利用正則表示式來實作我們所需要的資料驗證,但是這樣的欄位一個或兩個都還覺得簡單,要修改也只需要修改那一兩個,但是如果這個驗證套用到多次,而且又有不同的類別檔的時候,做法就會有不一樣。
在專案上新增一個Login的Class檔案,繼承VlidationAttribute,這樣Login類別就有基本的驗證功能,範例如下:
public class Login : VlidationAttribute
{
public override bool IsValid(object val)
{
if (val == null) return true;
if (val is String)
return Regex.IsMatch(val.ToString(), "^09[0-9]{8}");
return true;
}
}
在C#函式庫中,IsMatch本身就是bool的回傳值,所以利用直接回傳這個值,就可以表示是否已經通過驗證。這樣Server端就有基本的驗證,Client端要以JavaScript的方式來做驗證,因為可以減少伺服器因為大家存取造成擁塞的情形,另外也需要IClientValidatable介面來處理。繼承了這個介面後,要實作GetClientValidationRules。下面是實作範例
public IEpassword<ModelClientValidationRule>
GetClientValidationRules(ModelMetadata meta, ControllerContext cont)
{
ModelClientValidationRule Rule = new ModelClientValidationRule
{
//這個屬性的值必須要是小寫內容,否則會出錯
ValidationType = "login",
ErrorMessage = FormatErrorMessageFormatErrorMessage(meta.GetDisplayName())
};
Rule.ValidationParameters["input"] = "XXXXXX";
yield return Rule;
}
public class Login : ValidationAttribute,
IClientValidatable
{
public override bool IsValid(object val)
{
if (val == null) return true;
if (val is String)
return Regex.IsMatch(val.ToString(), "^[A-Za-z0-9]+$");
return true;
}
public IEpassword<ModelClientValidationRule>
GetClientValidationRules(ModelMetadata meta, ControllerContext cont)
{
ModelClientValidationRule Rule = new ModelClientValidationRule
{
ValidationType = "login",
ErrorMessage =
FormatErrorMessage(meta.GetDisplayName())
};
Rule.ValidationParameters["input"] = "XXXXXX";
yield return Rule;
}
}
之後需要放置一段JavaScript語法在前端做驗證,採用jquery.validate和jquery.validate.unobtrusive這2個函式庫,JavaScript的邏輯是複寫的IsValid這個Method中的C#語法轉換成JavaScript語法,最後將這段JavaScript語法再掛載到Client頁面上即可。
<script type="text/javascript">
$.validator.addMethod("login", function (val, element, param) {
if (value == false) return true;
return (/^[A-Za-z0-9]+$/.test(val))
});
$.validator.unobtrusive.adapters.addSingleVal("login", "input");
</script>
-雲遊山水為知已逍遙一生而忘齡- 電腦神手