ASP.NET MVC通过Model验证帮助我们很容易的实现对数据的验证,在默认的情况下,基于ValidationAttribute的声明是验证被使用,我们只需 要将相应的ValidationAttribute应用到Model的类型或者属性上即可。对于自定义验证,我们也只需要定义相应的Validation 就可以了,不过服务端验证比较简单,而客户端验证就要稍微复杂一些,本文提供一个简单的实例说明在ASP.NET MVC中实现自定义验证的基本步骤。[源代码从这里下载]

一、AgeRangeAttribute

用 于验证出生日期字段以确保年龄在制定的范围之内的AgeRangeAttribute定义如下,简单起见,我们直接让它直接继承自 RangeAttribute。服务端验证逻辑定义在重写的IsValid方法中,并且重写了FormatErrorMessage方法以便生成针对年龄 的验证消息。AgeRangeAttribute实现了IClientValidatable接口,并在实现的 GetClientValidationRules方法中生成客户端验证规则。在生成的类型为“agerange”的 ModelClientValidationRule 对象中包含三个参数(currentdate、minage和maxage),分别表示当前日期(用于计算年龄)、允许年龄的范围。

   1: public class AgeRangeAttribute : RangeAttribute, IClientValidatable
   2: {
   3:     public AgeRangeAttribute(int minimum, int maximum)
   4:         : base(minimum, maximum)
   5:     { }
   6:  
   7:     public override bool IsValid(object value)
   8:     {
   9:         DateTime birthDate = (DateTime)value;
  10:         DateTime age = new DateTime(DateTime.Now.Ticks - birthDate.Ticks);
  11:         return age.Year >= (int)this.Minimum && age.Year <= (int)this.Maximum;
  12:     }
  13:  
  14:     public override string FormatErrorMessage(string name)
  15:     {
  16:         return base.FormatErrorMessage("年龄");
  17:     }
  18:  
  19:     public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
  20:     {
  21:         ModelClientValidationRule validationRule = new ModelClientValidationRule(){ ValidationType = "agerange", ErrorMessage= FormatErrorMessage(metadata.DisplayName)};
  22:         validationRule.ValidationParameters.Add("currentdate",DateTime.Today.ToString("dd-MM-yyyy"));
  23:         validationRule.ValidationParameters.Add("minage",this.Minimum);
  24:         validationRule.ValidationParameters.Add("maxage",this.Maximum);
  25:         yield return validationRule;
  26:     }
  27: }

二、注册客户端验证方法

由于ASP.NET MVC采用JQuery
Validation进行客户端验证,我们可以通过如下的这段javascript来注册用于实现客户端验证的function和添加相应的
adapter。添加到jQuery.validator的用于进行年龄范围验证的function具有三个参数(value、element、
params)分别表示被验证的值、元素和传入的参数。验证逻辑必须的三个数值(当前日期、年龄范围最小和最大值)通过参数params获得。而该参数实
际上是在添加adapter时从通过上面定义的GetClientValidationRules方法生成的验证规则中获取的。

   1: jQuery.validator.addMethod("agerange",
   2: function (value, element, params) {
   3:     
   4:     var minAge = params.minage;
   5:     var maxAge = params.maxage;
   6:  
   7:     var literalCurrentDate = params.currentdate;
   8:     var literalBirthDate = value;
   9:     var literalCurrentDates = literalCurrentDate.split('-');
  10:     var literalBirthDates = literalBirthDate.split('-');
  11:  
  12:     var birthDate = new Date(literalBirthDates[2], literalBirthDates[1], literalBirthDates[0]);
  13:     var currentDate = new Date(literalCurrentDates[2], literalCurrentDates[1], literalCurrentDates[0]);
  14:     var age = currentDate.getFullYear() - birthDate.getFullYear();
  15:     return age >= minAge && age <= maxAge
  16: });
  17:  
  18: jQuery.validator.unobtrusive.adapters.add("agerange", ["currentdate", "minage", "maxage"], function (options) {
  19:     options.rules["agerange"] = {
  20:         currentdate: options.params.currentdate,
  21:         minage: options.params.minage,
  22:         maxage: options.params.maxage
  23:     };
  24:     options.messages["agerange"] = options.message;
  25: });

三、AgeRangeAttribute的应用

现在我们将AgeRangeAttribute 应用到一个简单的ASP.NET MVC应用中。在通过VS的ASP.NET
MVC项目模板创建的空Web应用中,我们定义了如下一个简单的Person类型,我们定义的AgeRangeAttribute
应用到了表示出生日期的BirthDate上,并将允许的年龄上、下限设置为18和30。

   1: public class Person
   2: {
   3:     [DisplayName("姓名")]
   4:     public string Name { get; set; }
   5:  
   6:     [AgeRange(18, 30, ErrorMessage = "{0}必须在{1}和{2}之间!")]   
   7:     [DisplayName("出生日期")]
   8:     [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd-MM-yyyy}")]
   9:     public DateTime? BirthDate { get; set; }
  10: }

然后我们添加如下一个HomeController,在默认的Action方法Index中我们将创建的Person对象呈现在默认的View中。

   1: public class HomeController : Controller
   2: {
   3:     public ActionResult Index()
   4:     {
   5:         return View(new Person{ BirthDate = DateTime.Today, Name = "Foo"});
   6:     }
   7:     [HttpPost]
   8:     public ActionResult Index(Person person)
   9:     {
  10:         return View(person);
  11:     }
  12: }

如下所示的代码片断代表了View的定义,我们直接调用HtmlHelper<TModel>的扩展方法EditorModel将作为 Model的Person对象以编辑模式呈现在一个表单中。最后一点不要忘了在Layout文件中讲包含上述javascript片断的js文件包含进 来。

   1: @model Person
   2: @using (Html.BeginForm())
   3: {     
   4:     @Html.EditorForModel()
   5:     <input type="submit" value="Save" />
   6: }

运行我们的程序,输入不合法出生日期并点击”Save”按钮提交表单(针对第一次客户端验证),客户端验证将会生效,具体效果如下图所示。

ASP.NET MVC如何实现自定义验证(服务端验证+客户端验证)的更多相关文章

  1. 自定义Attribute 服务端校验 客户端校验

    MVC 自定义Attribute 服务端校验 客户端校验/* GitHub stylesheet for MarkdownPad (http://markdownpad.com) *//* Autho ...

  2. [ASP.NET MVC]笔记(四) UnobtruSive AJAX和客户端验证

    UnobtruSive AJAX和客户端验证 ASP.NET MVC 已经默认开启非侵入试js和客户端验证,在web.config可以看到如下配置: <configuration> < ...

  3. ASP.NET MVC ValidationAttribute 服务器端自定义验证

    自己开发的公众号,可以领取淘宝内部优惠券 客户端验证 上文只说了客户端的自定义验证,这样对于用户的输入还是不够可靠,用户完全可以绕过我们定义的客户端验证.所以仅有客户端的验证还是不够的,我们还需要在服 ...

  4. asp.net mvc Route 使用自定义条件(constraints)禁止某ip登陆

    asp.net mvc Route 使用自定义条件(constraints)禁止某ip登陆 前言 本文的目的是利用Mvc route创建一个自定义约束来控制路由跳转实现禁止ip登陆,当然例子可能不合理 ...

  5. 常量,字段,构造方法 调试 ms 源代码 一个C#二维码图片识别的Demo 近期ASP.NET问题汇总及对应的解决办法 c# chart控件柱状图,改变柱子宽度 使用C#创建Windows服务 C#服务端判断客户端socket是否已断开的方法 线程 线程池 Task .NET 单元测试的利剑——模拟框架Moq

    常量,字段,构造方法   常量 1.什么是常量 ​ 常量是值从不变化的符号,在编译之前值就必须确定.编译后,常量值会保存到程序集元数据中.所以,常量必须是编译器识别的基元类型的常量,如:Boolean ...

  6. asp.net获取服务端和客户端信息

    asp.net获取服务端和客户端信息 获取服务器名:Page.Server.ManchineName获取用户信息:Page.User 获取客户端电脑名:Page.Request.UserHostNam ...

  7. SVN 服务端 和 客户端

    网址大全  |  EF CodeFirst  |  电视  |  MyNPOI  |  开源  |  我的皮肤  |  ASP.NET MVC4  |  前端提升  |  LINQ  |  WCF   ...

  8. 【转】TCP/UDP简易通信框架源码,支持轻松管理多个TCP服务端(客户端)、UDP客户端

    [转]TCP/UDP简易通信框架源码,支持轻松管理多个TCP服务端(客户端).UDP客户端 目录 说明 TCP/UDP通信主要结构 管理多个Socket的解决方案 框架中TCP部分的使用 框架中UDP ...

  9. [企业化NET]Window Server 2008 R2[3]-SVN 服务端 和 客户端 基本使用

    1.  服务器基本安装即问题解决记录      √ 2.  SVN环境搭建和客户端使用 2.1  服务端 和 客户端 安装    √ 2.2  项目建立与基本使用     √ 2.3  基本冲突解决, ...

随机推荐

  1. MSP430F149学习之路——UART

    代码一: #include <msp430x14x.h> void int_clk() { BCSCTL1 &= ~XT2OFF; BCSCTL2 |= SELM_2 + SELS ...

  2. BZOJ1051 受欢迎的牛

    http://www.lydsy.com/JudgeOnline/problem.php?id=1051 Description 每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A ...

  3. 简化对象extend拓展

    发现对对象继承或拷贝的时候,总是要$点来点去好麻烦,我的解决办法如下: (function(){ Object.prototype.extend = function(o){ $.extend(tru ...

  4. select修改原生样式组件

    <div class="select"> <select class="" name=""> <option ...

  5. zip的打包与解包和包下载

    text文件压缩包解析与下载 //压缩包下载  private StreamedContent newsTemplate; //该方法是对压缩包进行下载     public StreamedCont ...

  6. Unieap3.5Java端通过SQL语句直接查询DataStore

    通过sql查询dataStore 例子见 /mcss/src/com/neusoft/mcss/base/todo/dao/WorkTodoDaoImpl.java getWorksTodo() ID ...

  7. 比特币钱包应用breadwallet源码

    breadwallet是一款安全.可靠和便捷的比特币钱包,可使用户免于恶意软件和其他应用中常见的安全问题的骚扰,充分利用了iOS提供的安全功能,包括AES硬件加密.app沙盒和数据保护.代码签名以及k ...

  8. Query for Component Path within PeopleSoft Portal

     1) Run the below SQL to get the content reference name for your component ;-- Replace :1 with the c ...

  9. mr的logs的查看

    在map或者reduce函数中使用System.out.println打印的信息沾满查看呢? 步骤1:启动history server /usr/local/hadoop-2.6.0/sbin/mr- ...

  10. Jquery 实现json复杂查询等操作(jsonDB)

    一.jsonDB 下载地址:https://github.com/ThinkerCodeChina/jsonDB jsonDB是js的一个类库,实现使用SQL语句对json数据增删改查.jsonDB的 ...