2014年2月19日 星期三

ASP.NET MVC4 驗證規則自行撰寫

資訊工程開發時,有一項非常重要的學問,就是資料驗證。因為資料在傳輸的過程中,難免會有有心人士的惡意動作,隨意的存取資科,這時候開發者就作出保護資料的演譯。早期的開發驗證技術都是開發者自行撰寫,不過現今的程式語言,強大如微軟,內建的函式庫都有非常豐富的驗證元件供開發者使用。不過開發者也能自行撰寫所需要的驗證程式,大部分會用的的技術,就是利用正則表示式來實作我們所需要的資料驗證,但是這樣的欄位一個或兩個都還覺得簡單,要修改也只需要修改那一兩個,但是如果這個驗證套用到多次,而且又有不同的類別檔的時候,做法就會有不一樣。

在專案上新增一個Login的Class檔案,繼承VlidationAttribute,這樣Login類別就有基本的驗證功能,範例如下:

public class Login : VlidationAttribute
{
    public override bool IsValid(object val)
    {
        if (val == nullreturn 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>


-雲遊山水為知已逍遙一生而忘齡- 電腦神手

沒有留言:

張貼留言