原文:MVC验证04-自定义验证规则、日期范围验证

本文体验范围验证。与本文相关的包括:

MVC验证01-基础、远程验证  
MVC验证02-自定义验证规则、邮件验证  
MVC验证03-自定义验证规则、禁止输入某些值

当需要对字符串长度进行验证,可以用StringLength:
[StringLength(100, ErrorMessage = "{0} 必须至少包含 {2} 个字符。", MinimumLength = 6)]

当需要对数组范围进行验证,可以用Range:
[Range(0,5)]

如果需要对日期范围进行验证呢?
假设来验证日期,以当前日期为基准,介于当前日期和第七天之间的日期为有效,其它无效。

自定义验证特性,继承 ValidationAttribute 并实现IClientValidatable

重写基类ValidationAttribute的IsValid()方法,是为了服务端验证用的。
实现IClientValidatable接口方法,是为了在前端html元素增加某个属性,好让jquery侦测到。

  1. 展开using System;
  2. using System.ComponentModel.DataAnnotations;
  3. using System.Web.Mvc;
  4.  
  5. namespace MvcValidation.Extension
  6. {
  7. public class DayRangeAttribute : ValidationAttribute, IClientValidatable
  8. {
  9. private int _minDay;
  10. private int _maxDay;
  11.  
  12. public DayRangeAttribute(int minDay, int maxDay)
  13. {
  14. if (minDay.CompareTo(maxDay) > -1)
  15. {
  16. throw new Exception("最小日期不能大于或等于最大日期");
  17. }
  18. this._minDay = minDay;
  19. this._maxDay = maxDay;
  20. }
  21.  
  22. public override bool IsValid(object value)
  23. {
  24. if (value == null)
  25. return true;
  26. var compareDate = value as DateTime?;
  27. if (compareDate.HasValue)
  28. {
  29. compareDate = compareDate.Value.Date;
  30. return compareDate.Value >= DateTime.Today.AddDays(_minDay).Date &&
  31. compareDate.Value <= DateTime.Today.AddDays(_maxDay).Date;
  32. }
  33. return false;
  34. }
  35.  
  36. public System.Collections.Generic.IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
  37. {
  38. var rule = new ModelClientValidationRule
  39. {
  40. ValidationType = "dayrange", //这里的dayrange最终会成为data-val-dayrange属性被jquery侦测到
  41. ErrorMessage = FormatErrorMessage(metadata.GetDisplayName())
  42. };
  43. //这里了的min和max将会作为jquery验证扩展方法的参数
  44. rule.ValidationParameters["min"] = _minDay;
  45. rule.ValidationParameters["max"] = _maxDay;
  46. yield return rule;
  47. }
  48. }
  49. }

注意:
■ ValidationType = "dayrange"中的dayrange必须小写,否则报错。
■ ValidationType = "dayrange"最终成为html元素的一个属性data-val-dayrange,从而能被jquery侦测辨别。
■ rule.ValidationParameters["min"]和rule.ValidationParameters["max"],min和max将作为参数供jquery扩展方法使用,当然也必须是小写。

把自定义验证特性打到View model上

[DayRange(0, 7)]验证当天到第七天之内的日期。

  1. 展开 public class RegisterModel
  2. {
  3. [Required]
  4. [StringLength(6, MinimumLength = 2)] //加
  5. [Display(Name = "用户名")]
  6. //[Remote("CheckUserName","Validate", ErrorMessage = "远程验证用户名失败")]
  7. [NoInput("demo,jack",ErrorMessage = "不能使用此名称")]
  8. public string UserName { get; set; }
  9.  
  10. [Required]
  11. [DataType(DataType.EmailAddress)]
  12. [Display(Name = "邮件")]
  13. //[Email]
  14. public string Email { get; set; }
  15.  
  16. [DayRange(0, 7)]
  17. [Display(Name = "上课时间")]
  18. public DateTime ClassDate { get; set; }
  19.  
  20. [Required]
  21. [StringLength(100, ErrorMessage = "{0}栏位最少{2}个字,最多{1}个字", MinimumLength = 6)]
  22. [DataType(DataType.Password)]
  23. [Display(Name = "密码")]
  24. public string Password { get; set; }
  25.  
  26. [DataType(DataType.Password)]
  27. [Display(Name = "确认密码")]
  28. [System.ComponentModel.DataAnnotations.Compare("Password", ErrorMessage = "密码和确认密码不匹配。")]
  29. public string ConfirmPassword { get; set; }

扩展jquery验证jQuery.validator.dayrange.js

  1. //扩展jquery验证方法
  1. //第一个参数是前端输入的值
  1. //第二个参数是html元素
  1. //第三个参数是自定义验证特性DayRangeArribute中rule.ValidationParameters["min"]和rule.ValidationParameters["max"]的键值
  1. jQuery.validator.addMethod('dayrange', function(value, element, param) {
  1. if (!value) {
  1. return false;
  1. }
  1. //value:1999/1/1
  1. var valueDateParts = value.split('-');
  1. var minDate = new Date();
  1. var maxDate = new Date();
  1. var now = new Date();
  1. var dateValue = new Date(valueDateParts[2],
  1. (valueDateParts[1] - 1),
  1. valueDateParts[0],
  1. now.getHours(),
  1. now.getMinutes(),
  1. (now.getSeconds() + 5));
  1.  
  1. minDate.setDate(minDate.getDate() - parseInt(param.min));
  1. maxDate.setDate(maxDate.getDate() + parseInt(param.max));
  1.  
  1. return dateValue >= minDate && dateValue <= maxDate;
  1. });
  1.  
  1. //第一个参数是jquery验证扩展方法名
  1. //第二和第三个参数分别是最小或最大值
  1. //第三个参数为DayRangeAttribute中ValidationType对应的值
  1. jQuery.validator.unobtrusive.adapters.addMinMax('dayrange', 'min', 'max', 'dayrange');

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

Register.cshtml视图

  1. 展开@model MvcValidation.Models.RegisterModel
  2. @{
  3. ViewBag.Title = "注册";
  4. }
  5.  
  6. <hgroup class="title">
  7. <h1>@ViewBag.Title.</h1>
  8. <h2>创建新帐户。</h2>
  9. </hgroup>
  10.  
  11. @using (Html.BeginForm()) {
  12. @Html.AntiForgeryToken()
  13. @Html.ValidationSummary()
  14.  
  15. <fieldset>
  16. <legend>注册表单</legend>
  17. <ol>
  18. <li>
  19. @Html.LabelFor(m => m.UserName)
  20. @Html.TextBoxFor(m => m.UserName)
  21. </li>
  22. <li>
  23. @Html.LabelFor(m => m.Email)
  24. @Html.TextBoxFor(m => m.Email)
  25. </li>
  26. <li>
  27. @Html.LabelFor(m => m.ClassDate)
  28. @Html.TextBoxFor(m => m.ClassDate)
  29. </li>
  30. <li>
  31. @Html.LabelFor(m => m.Password)
  32. @Html.PasswordFor(m => m.Password)
  33. </li>
  34. <li>
  35. @Html.LabelFor(m => m.ConfirmPassword)
  36. @Html.PasswordFor(m => m.ConfirmPassword)
  37. </li>
  38. </ol>
  39. <input type="submit" value="注册" />
  40. </fieldset>
  41. }
  42.  
  43. @section Scripts {
  44. @Scripts.Render("~/bundles/jqueryval")
  45. <script src="~/Scripts/jQuery.validator.dayrange.js"></script>
  46. }

效果:

MVC验证04-自定义验证规则、日期范围验证的更多相关文章

  1. ASP.NET MVC如何实现自定义验证(服务端验证+客户端验证)

    ASP.NET MVC通过Model验证帮助我们很容易的实现对数据的验证,在默认的情况下,基于ValidationAttribute的声明是验证被使用,我们只需 要将相应的ValidationAttr ...

  2. MVC验证02-自定义验证规则、邮件验证

    原文:MVC验证02-自定义验证规则.邮件验证 本文体验MVC自定义验证特性,来实现对邮件的验证.对于刚写完的自定义验证特性,起初只能支持后端验证.如果要让前端jquery支持,还必须对jquery的 ...

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

    MVC ValidationAttribute 服务器端自定义验证 客户端验证 上文只说了客户端的自定义验证,这样对于用户的输入还是不够可靠,用户完全可以绕过我们定义的客户端验证.所以仅有客户端的验证 ...

  4. asp.net mvc 中的自定义验证(Custom Validation Attribute)

    前言

  5. EasyUI表单验证,自定义插件验证,自定义js插件验证,远程验证,常见手机号,中英文,qq等验证规则验证

     { field : 'startPort', title : "起始端口", editor: "text", width : 50, editor: { ...

  6. mvc 实体类 自定义验证特性

    mvc 实体类验证的时候 如果有多个验证特性需要在属性上层叠很多个验证特性,显得属性特别臃肿并且也不够直观,极大地影响我使用它的兴趣,所以我想自定义一个验证特性,然后将所有需要验证的情形全部放在一个特 ...

  7. MVC身份验证.MVC过滤器.MVC6关键字Task,Async.前端模拟表单验证,提交.自定义匿名集合.Edge导出到Excel.BootstrapTree树状菜单的全选和反选.bootstrap可搜索可多选可全选下拉框

    1.MVC身份验证. 有两种方式.一个是传统的所有控制器继承自定义Control,然后再里面用MVC的过滤器拦截.所以每次网站的后台被访问时.就会先走入拦截器.进行前端和后端的验证 一个是利用(MVC ...

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

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

  9. 解决.Net MVC 中出现 非介入式客户端验证规则中的验证类型名称必须唯一。下列验证类型出现重复: required 的bug

    最近在开动科技创新作品的开发,出现了一个让人很烦恼的错误,每次从浏览页跳转到编辑页时就会出现一下错误 非介入式客户端验证规则中的验证类型名称必须唯一.下列验证类型出现重复: required 上一下出 ...

随机推荐

  1. 在SQL2008中,如何让id自动生成并自动递增?如何让时间默认生成?

    id自动递增:    如果是用语句操作,这样定义:ID INT IDENTITY,如果是要生成一对数字,这样定义:ID INT IDENTITY(1,1)    如果要在SQL Server的表中设置 ...

  2. VS怎样创建和使用lib文件

    假设你当前正在使用vs写了一个project,那么你想如今就生成一个Lib文件,那么能够直接在"项目属性"上进行改动i 项目属性->配置属性->常规->配置类型中 ...

  3. 飞信免费邮件api,飞信界面

    大家都知道飞信是能够免费发送短信的,可是飞信又没有官方的接口,所以无法借用移动的官方接口实现短信的免费发送,可是还是有一些破解的接口能够使用的. GET方法: 提交格式 http://66.zzuob ...

  4. Servlet实例解说

    打开昨天上午,负责人突然问我,client控制信息,如何让在后台?我想回答:假设总体提交form,在C#使用代码request获取表单的内容.假设局部提交,在用JS和Ajax交互,通过Ajax的ope ...

  5. rabbitmq技术的一些感悟(一)

    Rabbitmq 初识rabbitmq RabbitMQ是流行的开源消息队列系统,用erlang语言开发.RabbitMQ是AMQP(高级消息队列协议)的标准实现.假设不熟悉AMQP,直接看Rabbi ...

  6. 三种字符编码:ASCII、Unicode和UTF-8

    原文:三种字符编码:ASCII.Unicode和UTF-8 什么是字符编码? 计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特(bit)作为一个字 ...

  7. Docker简介(转)

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何 ...

  8. ubuntu安装jdk eclipse mysql等

    linux ubuntu下安装java web开发环境,需要安装包: jdk7 eclipse(选择java EE developer) apche-tomcat mysql(workbench可视化 ...

  9. Linux内核分析(一)---linux体系简介|内核源码简介|内核配置编译安装

    原文:Linux内核分析(一)---linux体系简介|内核源码简介|内核配置编译安装 Linux内核分析(一) 从本篇博文开始我将对linux内核进行学习和分析,整个过程必将十分艰辛,但我会坚持到底 ...

  10. EMVTag系列5《8E 持卡人验证方法(CVM)名单》

    L: var. up to 252 -R(需求):数据必须存在,在读应用数据过程中,终端不检查 依照优先顺序列出卡片应用支持的全部持卡人验证方法 注:一个应用中能够有多个CVM列表,比如一个用于国内交 ...