[Asp .Net MVC] MVC Client 端驗證 (Unobtrusive Validate)

前陣子有一篇文章 [Asp .Net MVC] AjaxHelper 失效了!Why? ,在介紹使用 Unobtrusive Ajax 來讓AjaxHelper 的 Form Submit 正常,

往下開發的時候,發現我們在使用MVC 資料標記(Data Annotations),每次都得回到後端檢核後才能知道前端傳回來的資料是否符合條件,

才發現原來沒有使用到 Unobtrusive Validate 的機制來做Client 端的資料檢核。

Unobtrusive 翻譯叫「低調的」,其實就是想讓程式設計師開發時,能專注在某項特定項目上,讓在刻畫Html 的專心刻畫Html,撰寫JavaScript 的專心寫JavaScript,

換句話說,就是前端畫面的「關注點分離」,

於是乎撰寫Html只需要在Html 標上某些特定(約定好的)的Tag ,即可完成相對應的動作。

當然微軟已經把這些特定的Tag定義好,也把相關的JavaScript寫好了,甚至是把自動產生Tag的功能做出來了(HtmlHelper),

所以我們來談談該怎麼使用吧!

以AjaxHelper 的「BeginForm」 來說,我們的Code 會像這樣:

@using (Ajax.BeginForm("Send", "Apply",
                                new AjaxOptions()
                                {
                                    HttpMethod = "POST",
                                    UpdateTargetId = "xxxDiv",
                                    InsertionMode = InsertionMode.Replace,
                                    OnBegin = "OnBeginCheck",
                                    OnSuccess = "OnSuccess",
                                    OnFailure = "OnFailure"
                                }
                                ))
{
     //HTML
}

實際的HTML 是這樣:

<form action="/xxxx/aaaa/Apply/Send" data-ajax="true" data-ajax-begin="OnBeginCheck" data-ajax-failure="OnFailure" data-ajax-method="POST" 
data-ajax-mode="replace" data-ajax-success="OnSuccess" 
data-ajax-update="#xxxDiv" id="form0" method="post">
</form>

可以發現,都只是利用Html Tag 標示Ajax 的行為與動作,但在Html 裡面寫這些Tag 並不會有任何Ajax 行為的,

其實是「Unobtrusive-Ajax」透過JQuery Selector 掃出有「data-ajax="true"」的Form,再根據這個Form裡面定義的tag 來幫Form 做Ajax 的行為。

以上是Unobtrusive Ajax 的概念。

接下來就進入本篇的正題,如何透過Unobtrusive Validate 來進行驗證呢?

首先是我們在ViewModel 定義一個「申請主旨」,並透過Data Annotations 的方式,要求該屬性為必填:

        [Required(ErrorMessage = "申請主旨為必填欄位.")]
        [Display(Name = "申請主旨")]
        public string ApplySubject { get; set; }

前端透過Razor 產生一個Input:

@Html.TextBoxFor(x => x.ApplySubject)

實際上的Html:

<input class="k-textbox" data-val="true" data-val-required="申請主旨為必填欄位." id="ApplySubject" name="ApplySubject">

可以發現,實際上的Html 也是有很多Tag ,Unobstrusive Validate 會透過JQuery Selector 找尋有「data-val="true"」的控制項,並根據tag來看要做何種驗證,以及顯示何種錯誤訊息。

當然,如果你只是單純寫以上的Code 是不會有任何動作的,要記得把相關的JS 引用進來,

首先到NuGet 下載「Unobtrusive Validation」,

當然別忘記引用進來,下圖是透過Boudle Include JS的,

WebConfig 也要允許使用Client 端驗證以及Unobstrusive JavaScript,



 

最後,只要當您的資料不符合定義的時候,就會產生Validattion Message ,

結論:

透過這種方式做驗證,可以降低系統的Loading 因為不用再把資料送回來,才知道資料是否正確,

另外,也有雙重防護的保障,即前端驗證一次,後段再驗證一次。