MVC5 + EF6 + Bootstrap3 (16) 客戶端驗證


Slark.NET-博客園 http://www.cnblogs.com/slark/p/mvc5-ef6-bs3-get-started-client-side-validation.html

系列教程:MVC5 + EF6 + Bootstrap3

上一節: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/

本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。如有問題或建議,請多多賜教,非常感謝。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM