在mvc中使用表單進行數據提交時,數據驗證分為服務器端驗證和客戶端驗證;
我們可以通過使用HtmlHelper中的方法及在頁面中引用js庫對Model的屬性的數據注解(System.ComponentModel.DataAnnotations命名空間下的一組類)進行解析,實現前端、后端的數據驗證;
HtmlHelper、數據注解在其他文章中再詳細介紹,本文主要介紹如何使數據驗證發生作用。
下面分別介紹兩種驗證方式:
一、服務器端驗證
要實現服務器端的驗證非常簡單,只需要滿足下面三個條件:
①有數據注解
②頁面部分使用HtmlHelper生成各種表單元素
使用這些html標簽的時候,需要引用一下mvc工程中的css文件:
<link href="~/Content/Site.css" rel="stylesheet" />
③在后端代碼中指明需要驗證
但是只有服務器端的驗證不能滿足我們,因為每一次的錯誤數據都會提交到服務器,不僅影響了性能,用戶體驗也差強人意。
二、客戶端驗證
客戶端驗證是通過jquery validate插件進行數據驗證的,它需要有jquery的支持,因此在引用它之前必須引用jquery文件。
但jquery validate是需要在js中編寫相關代碼(如下圖),才能實現數據驗證的;
但這樣子也是挺麻煩的,我們在屬性寫的數據注解豈不是沒什么卵用了,不用擔心,只要我們引用一下mvc工程中的 jquery.validate.unobtrusive.js 就可以啦。
利用mvc的HtmlHelper中類似Html.EditorFor(m => m.Name)這樣的語法,生成的代碼如下:
<input class="text-box single-line" data-val="true" data-val-required="請輸入用戶名!" id="Name" name="Name" type="text" value="">
這樣子,引用的js庫就可以解析以data-val-為前綴的屬性用來設置驗證規則了。data-val="true"表示對用戶輸入的值進行驗證。
如果上面的js庫你都引用了,但客戶端的驗證還是沒有起效,那就檢查一下配置文件吧。在配置文件中,有兩個選項是需要配置為true的,建立mvc應用程序的時候,默認是已經添加了的。
第一行表示啟用客戶端驗證;
第二行表示啟用unobtrusive相關的js驗證,在使用AjaxHelper,引用jquery.unobtrusive-ajax.js時,也需要該配置為true;
綜上所述,客戶端的驗證需要滿足以下幾個條件:
①有數據注解
②頁面部分使用HtmlHelper生成各種表單元素
③引用相關js文件,如下圖:
④配置web.config(默認存在)
三、總結
在實際開發中,基本都是客戶端驗證+服務器端驗證一起使用的;
也有的驗證可能還是需要在js中實現,那么在進行后端驗證時,就不能只以ModelState.IsValid為參考了,還需要寫額外代碼驗證;如果有錯誤的時候,可以使用ModelState.AddModelError("key", "errorMesaage");//第一個參數是key,第二個參數是要顯示的錯誤消息
在頁面中展示后台的錯誤消息的時候,有兩種方式:
①Html.ValidationSummary(true)
ValidationSummary有幾種重載形式:
重載形式 |
說明 |
Html.ValidationSummary() |
匯總顯示所有的驗證錯誤 |
Html.ValidationSummary(bool) |
如果bool參數=true,只顯示Model層次的錯誤,否則所有的驗證錯誤都顯示 |
Html.ValidationSummary(string) |
在所有錯誤消息之前再顯示string給出的字符串 |
Html.ValidationSummary(bool, string) |
同Html.ValidationSummary(bool),只是在錯誤消息前多顯示string給出的字符串 |
在頁面數據提交到后台時,表明屬性的數據注解驗證已經通過了,因此前端顯示錯誤消息的時候只會顯示 ModelState.AddModelError()方法中的錯誤消息;
在頁面中會生成如下圖所示的div:
ValidationSummary方法會展示所有的錯誤消息,而不會根據key值顯示特定的消息;主要用來匯總顯示從后台返回的錯誤消息列表。
②Html.ValidationMessage(key)
該方法會根據ModelState.AddModelError("key", "errorMesaage")里的key值顯示對應的錯誤消息;
它在前端生成的是一個span標簽;
不過通常不會使用該方法,而是使用Html.ValidationMessageFor(c => c.Name)顯示屬性的數據注解的錯誤消息;