Slark.NET-博客園 http://www.cnblogs.com/slark/p/mvc5-ef6-bs3-get-started-client-side-validation.html
上一節:MVC5 + EF6 + Bootstrap3 (15) 應用ModelState和Data Annotation做服務器端數據驗證
源碼下載:點我下載
本節內容比較簡單,在上節服務器端驗證的基礎上介紹客戶端驗證。
客戶端驗證的好處是不用向服務器提交代碼就能顯示出錯誤信息。反應更快,與用戶交互更流暢。
然而,其致命的弱點就是驗證腳本可以在客戶端被隨意修改。因此它是不可靠的。
所以我們這里介紹怎樣給單純的服務器端驗證加上客戶端驗證。
那么我們就基於上一節講的Data Annotation驗證添加客戶端驗證。點此查看。
首先,確認解決方案根目錄下的web.config文件中激活了客戶端驗證:
1 <configuration> 2 <appSettings> 3 <add key="ClientValidationEnabled" value="true" /> 4 <add key="UnobtrusiveJavaScriptEnabled" value="true" /> 5 </appSettings> 6 </configuration>
第3行表示激活了客戶端驗證。第4行表示激活Unobstrusive JavaScript。它代表着一種將Html代碼和JavasScript分離開的思想。總體來說就是用代碼分離的思想做客戶端驗證。
然后繼續使用上一節創建的Model和Controller。為了方便大家查看,這里貼出代碼,對代碼的具體解釋點此查看。
Models/DataAnnotationModel.cs
1 using System.ComponentModel.DataAnnotations; 2 namespace SlarkInc.Models 3 { 4 public class DataAnnotationModel 5 { 6 [Required(ErrorMessage = "Name is required")] 7 public string Name { get; set; } 8 9 [Required(ErrorMessage = "Email is required")] 10 [RegularExpression(@"^\s*([A-Za-z0-9_-]+(\.\w+)*@([\w-]+\.)+\w{2,3})\s*$", ErrorMessage = "Email is invalid")] 11 public string Email { get; set; } 12 } 13 }
Controllers/DataValidationController.cs
1 using System.Web.Mvc; 2 using SlarkInc.Models; 3 using System.Text.RegularExpressions; 4 5 namespace SlarkInc.Controllers 6 { 7 public class DataValidationController : Controller 8 { 9 public ActionResult DataAnnotationAction() 10 { 11 return View(); 12 } 13 14 [HttpPost] 15 public ActionResult DataAnnotationAction(DataAnnotationModel model) 16 { 17 if (ModelState.IsValid) 18 { 19 ViewBag.Name = model.Name; 20 ViewBag.Email = model.Email; 21 } 22 return View(model); 23 } 24 } 25 }
View代碼繼續沿用,不過需要添加客戶端驗證所需的js文件。
Views/DataValidation/DataAnnotationAction.cshtml
1 @model SlarkInc.Models.DataAnnotationModel 2 @{ 3 ViewBag.Title = "DataAnnotationAction"; 4 } 5 <h2>Data Annotation Validation</h2> 6 @Html.ValidationSummary() 7 @using (Html.BeginForm()) 8 { 9 if (@ViewData.ModelState.IsValid && ViewBag.Name != null) 10 { 11 <b> 12 Name : @ViewBag.Name 13 <br /> 14 Email: @ViewBag.Email 15 </b> 16 } 17 <fieldset> 18 <div class="editor-label"> 19 @Html.LabelFor(model => model.Name) 20 </div> 21 <div class="editor-field"> 22 @Html.EditorFor(model => model.Name) 23 @Html.ValidationMessageFor(model => model.Name) 24 </div> 25 <div class="editor-label"> 26 @Html.LabelFor(model => model.Email) 27 </div> 28 <div class="editor-field"> 29 @Html.EditorFor(model => model.Email) 30 @Html.ValidationMessageFor(model => model.Email) 31 </div> 32 <br /> 33 <input type="submit" value="Submit" /> 34 </fieldset> 35 } 36 @section Scripts 37 { 38 @Scripts.Render("~/bundles/jqueryval") 39 }
第36-39行用來添加客戶端驗證所需的js文件。
這一段代碼會調用App_Start文件夾下的BundleConfig.cs文件。文件內容如下:
1 namespace SlarkInc 2 { 3 public class BundleConfig 4 { 5 public static void RegisterBundles(BundleCollection bundles) 6 { 7 bundles.Add(new ScriptBundle("~/bundles/jquery").Include( 8 "~/Scripts/jquery-{version}.js")); 9 10 bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include( 11 "~/Scripts/jquery.validate*")); 12 13 bundles.Add(new ScriptBundle("~/bundles/modernizr").Include( 14 "~/Scripts/modernizr-*")); 15 16 bundles.Add(new ScriptBundle("~/bundles/bootstrap").Include( 17 "~/Scripts/bootstrap.js", 18 "~/Scripts/respond.js")); 19 20 bundles.Add(new StyleBundle("~/Content/css").Include( 21 "~/Content/bootstrap.css", 22 "~/Content/site.css")); 23 } 24 } 25 }
第10和11行的代碼會被調用。代碼會引入所有符合"~/Scripts/jquery.validate*"條件的js文件。
即以下紅色方框內文件:
按F5運行,輸入以下錯誤信息,可以看到如下驗證提示信息:
點提交按鈕時,頁面沒有刷新,證明是客戶端驗證。
右鍵點擊頁面,選擇查看源代碼。可以看到Scripts.Render("~/bundles/jqueryval")函數向頁面里加入了如下兩個js文件。
1 <script src="/Scripts/jquery.validate.js"></script> 2 <script src="/Scripts/jquery.validate.unobtrusive.js"></script>
為什么不是之前截圖看到的5個?我推測這和web.config設置以及用的是debug或release編譯模式有關。
在頁面生成的兩個輸入框的代碼如下:
Name:
1 <div class="editor-field"> 2 <input class="text-box single-line" data-val="true" data-val-required="Name is required" id="Name" name="Name" type="text" value="" / > 3 <span class="field-validation-valid" data-valmsg-for="Name" data-valmsg-replace="true"></span> 4 </div>
Email:
1 <div class="editor-field"> 2 <input class="text-box single-line" data-val="true" data-val-regex="Email is invalid" data-val-regex-pattern="^\s*([A-Za-z0-9_-]+(\.\ w+)*@([\w-]+\.)+\w{2,3})\s*$" data-val-required="Email is required" id="Email" name="Email" type="text" value="" /> 3 <span class="field-validation-valid" data-valmsg-for="Email" data-valmsg-replace="true"></span> 4 </div>
可以看到驗證所需的信息都在html代碼里,而驗證的函數邏輯都在引入的validate的js文件里。兩部分完全分離,但是又配合得很好。
到此,我們的客戶端驗證就介紹完了。
后面會持續更新,敬請期待。
上一節:MVC5 + EF6 + Bootstrap3 (15) 應用ModelState和Data Annotation做服務器端數據驗證
作者:Slark.NET
出處:http://www.cnblogs.com/slark/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。如有問題或建議,請多多賜教,非常感謝。