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文件中激活了客户端验证:

 <configuration>
<appSettings>
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
</appSettings>
</configuration>

第3行表示激活了客户端验证。第4行表示激活Unobstrusive JavaScript。它代表着一种将Html代码和JavasScript分离开的思想。总体来说就是用代码分离的思想做客户端验证。

然后继续使用上一节创建的Model和Controller。为了方便大家查看,这里贴出代码,对代码的具体解释点此查看

Models/DataAnnotationModel.cs

 using System.ComponentModel.DataAnnotations;
namespace SlarkInc.Models
{
public class DataAnnotationModel
{
[Required(ErrorMessage = "Name is required")]
public string Name { get; set; } [Required(ErrorMessage = "Email is required")]
[RegularExpression(@"^\s*([A-Za-z0-9_-]+(\.\w+)*@([\w-]+\.)+\w{2,3})\s*$", ErrorMessage = "Email is invalid")]
public string Email { get; set; }
}
}

Controllers/DataValidationController.cs

 using System.Web.Mvc;
using SlarkInc.Models;
using System.Text.RegularExpressions; namespace SlarkInc.Controllers
{
public class DataValidationController : Controller
{
public ActionResult DataAnnotationAction()
{
return View();
} [HttpPost]
public ActionResult DataAnnotationAction(DataAnnotationModel model)
{
if (ModelState.IsValid)
{
ViewBag.Name = model.Name;
ViewBag.Email = model.Email;
}
return View(model);
}
}
}

View代码继续沿用,不过需要添加客户端验证所需的js文件。

Views/DataValidation/DataAnnotationAction.cshtml

 @model SlarkInc.Models.DataAnnotationModel
@{
ViewBag.Title = "DataAnnotationAction";
}
<h2>Data Annotation Validation</h2>
@Html.ValidationSummary()
@using (Html.BeginForm())
{
if (@ViewData.ModelState.IsValid && ViewBag.Name != null)
{
<b>
Name : @ViewBag.Name
<br />
Email: @ViewBag.Email
</b>
}
<fieldset>
<div class="editor-label">
@Html.LabelFor(model => model.Name)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Name)
@Html.ValidationMessageFor(model => model.Name)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Email)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Email)
@Html.ValidationMessageFor(model => model.Email)
</div>
<br />
<input type="submit" value="Submit" />
</fieldset>
}
@section Scripts
{
@Scripts.Render("~/bundles/jqueryval")
}

第36-39行用来添加客户端验证所需的js文件。

这一段代码会调用App_Start文件夹下的BundleConfig.cs文件。文件内容如下:

 namespace SlarkInc
{
public class BundleConfig
{
public static void RegisterBundles(BundleCollection bundles)
{
bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
"~/Scripts/jquery-{version}.js")); bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include(
"~/Scripts/jquery.validate*")); bundles.Add(new ScriptBundle("~/bundles/modernizr").Include(
"~/Scripts/modernizr-*")); bundles.Add(new ScriptBundle("~/bundles/bootstrap").Include(
"~/Scripts/bootstrap.js",
"~/Scripts/respond.js")); bundles.Add(new StyleBundle("~/Content/css").Include(
"~/Content/bootstrap.css",
"~/Content/site.css"));
}
}
}

第10和11行的代码会被调用。代码会引入所有符合"~/Scripts/jquery.validate*"条件的js文件。

即以下红色方框内文件:

按F5运行,输入以下错误信息,可以看到如下验证提示信息:

点提交按钮时,页面没有刷新,证明是客户端验证。

右键点击页面,选择查看源代码。可以看到Scripts.Render("~/bundles/jqueryval")函数向页面里加入了如下两个js文件。

 <script src="/Scripts/jquery.validate.js"></script>
<script src="/Scripts/jquery.validate.unobtrusive.js"></script>

为什么不是之前截图看到的5个?我推测这和web.config设置以及用的是debug或release编译模式有关。

在页面生成的两个输入框的代码如下:

Name:

 <div class="editor-field">
<input class="text-box single-line" data-val="true" data-val-required="Name is required" id="Name" name="Name" type="text" value="" /        >
<span class="field-validation-valid" data-valmsg-for="Name" data-valmsg-replace="true"></span>
</div>

Email:

 <div class="editor-field">
<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="" />
<span class="field-validation-valid" data-valmsg-for="Email" data-valmsg-replace="true"></span>
</div>

可以看到验证所需的信息都在html代码里,而验证的函数逻辑都在引入的validate的js文件里。两部分完全分离,但是又配合得很好。

到此,我们的客户端验证就介绍完了。

后面会持续更新,敬请期待。

上一节:MVC5 + EF6 + Bootstrap3 (15) 应用ModelState和Data Annotation做服务器端数据验证

作者:Slark.NET

出处:http://www.cnblogs.com/slark/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。如有问题或建议,请多多赐教,非常感谢。

最新文章

  1. pl/sql配置连接远程数据库oracle,本地没有安装oracle数据库的情况下
  2. 使用 Spring 3 来创建 RESTful Web Services
  3. mvc4中的 webapi 的使用方式
  4. [设计模式] javascript 之 建造者模式
  5. Symfony Composer icu requires lib-icu
  6. Jenkins快速搭建持续集成
  7. [ext4]010 磁盘布局 - 如何查找inode的磁盘位置
  8. C#多线程的用法1-简单示例
  9. C&amp;C++ Calling Convention
  10. Python编程Day3—基本运算符、数据类型
  11. mysql-数据库管理安装
  12. 论文笔记 SSD: Single Shot MultiBox Detector
  13. 001_fpm打包命令详解
  14. 170627、springboot编程之定时任务
  15. 59. Spiral Matrix II (Array)
  16. &lt;Android 基础(二十三)&gt; Android Studio快捷键
  17. 做Mysql主从时,注意使用replicate_wild_do_table和replicate-wild-ignore-table【转】
  18. webpack快速入门(二):使用入门
  19. python(unittest)报告导出(二):使用 BeautifulReport导出
  20. delphi inifile 支持 utf8

热门文章

  1. 奇妙的CSS之布局与定位
  2. Android开发学习——基础学习
  3. iOS中,在类的源文件(.m)中,@interface部分的作用?
  4. iOS UIActivityIndicatorView
  5. Android Studio连接真机没反应?
  6. 记录一次Quartz2D学习(一)
  7. vagrant vbox上配置好开发环境缓存问题
  8. C/C++浮点数在内存中的存储方式
  9. jquery2源码分析系列
  10. STM32 Unicode 与 GBK 转换 .bin文件放到SD卡是啥意思