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

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侦测到。

展开using System;
using System.ComponentModel.DataAnnotations;
using System.Web.Mvc;namespace MvcValidation.Extension
{public class DayRangeAttribute : ValidationAttribute, IClientValidatable{private int _minDay;private int _maxDay;public DayRangeAttribute(int minDay, int maxDay){if (minDay.CompareTo(maxDay) > -1){throw new Exception("最小日期不能大于或等于最大日期");}this._minDay = minDay;this._maxDay = maxDay;}public override bool IsValid(object value){if (value == null)return true;var compareDate = value as DateTime?;if (compareDate.HasValue){compareDate = compareDate.Value.Date;return compareDate.Value >= DateTime.Today.AddDays(_minDay).Date &&compareDate.Value <= DateTime.Today.AddDays(_maxDay).Date;}return false;}public System.Collections.Generic.IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context){var rule = new ModelClientValidationRule{ValidationType = "dayrange", //这里的dayrange最终会成为data-val-dayrange属性被jquery侦测到ErrorMessage = FormatErrorMessage(metadata.GetDisplayName())};//这里了的min和max将会作为jquery验证扩展方法的参数rule.ValidationParameters["min"] = _minDay;rule.ValidationParameters["max"] = _maxDay;yield return rule;}}
}

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

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

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

展开 public class RegisterModel{[Required][StringLength(6, MinimumLength = 2)] //加[Display(Name = "用户名")]//[Remote("CheckUserName","Validate", ErrorMessage = "远程验证用户名失败")][NoInput("demo,jack",ErrorMessage = "不能使用此名称")]public string UserName { get; set; }[Required][DataType(DataType.EmailAddress)][Display(Name = "邮件")]//[Email]public string Email { get; set; }[DayRange(0, 7)][Display(Name = "上课时间")]public DateTime ClassDate { get; set; }[Required][StringLength(100, ErrorMessage = "{0}栏位最少{2}个字,最多{1}个字", MinimumLength = 6)][DataType(DataType.Password)][Display(Name = "密码")]public string Password { get; set; }[DataType(DataType.Password)][Display(Name = "确认密码")][System.ComponentModel.DataAnnotations.Compare("Password", ErrorMessage = "密码和确认密码不匹配。")]public string ConfirmPassword { get; set; }

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

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

Register.cshtml视图

展开@model MvcValidation.Models.RegisterModel
@{ViewBag.Title = "注册";
}<hgroup class="title"><h1>@ViewBag.Title.</h1><h2>创建新帐户。</h2>
</hgroup>@using (Html.BeginForm()) {@Html.AntiForgeryToken()@Html.ValidationSummary()<fieldset><legend>注册表单</legend><ol><li>@Html.LabelFor(m => m.UserName)@Html.TextBoxFor(m => m.UserName)</li><li>@Html.LabelFor(m => m.Email)@Html.TextBoxFor(m => m.Email)</li><li>@Html.LabelFor(m => m.ClassDate)@Html.TextBoxFor(m => m.ClassDate)</li><li>@Html.LabelFor(m => m.Password)@Html.PasswordFor(m => m.Password)</li><li>@Html.LabelFor(m => m.ConfirmPassword)@Html.PasswordFor(m => m.ConfirmPassword)</li></ol><input type="submit" value="注册" /></fieldset>
}@section Scripts {@Scripts.Render("~/bundles/jqueryval")<script src="~/Scripts/jQuery.validator.dayrange.js"></script>
}

效果:

MVC验证04-自定义验证规则、日期范围验证相关推荐

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

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

  2. excel学习笔记:数据格式,单元格格式(快捷键,自动调整行列宽,条件格式,自定义格式,日期星期时间的设置,特殊数字,多种填充方式,从下拉列表选择,数据验证。)

    文章目录 数据格式.单元格格式 1. 快捷键 2. 自动调整列/行宽 3. 条件格式 4. 日期设置 5. 星期设置 6. 时间设置 7. 特殊数字 8. 选中多个填充,ctrl选中,输入100,ct ...

  3. 后盾网lavarel视频项目---自定义验证和自定义验证规则

    后盾网lavarel视频项目---自定义验证和自定义验证规则 一.总结 一句话总结: 1.自定义验证就是用的自定义验证请求类:php artisan make:request AdminPost 2. ...

  4. java注解定义时间格式_SpringBoot基础教程2-1-8 数据验证-自定义日期格式验证

    1 概述 javax.validation包与hibernate-validator包中注解能满足大部分需求,但是还是有必要熟悉下自定义数据验证注解,如日期格式验证. 2 添加依赖 org.sprin ...

  5. 9、 Struts2验证(声明式验证、自定义验证器)

    1. 什么是Struts2 验证器 一个健壮的 web 应用程序必须确保用户输入是合法.有效的. Struts2 的输入验证 基于 XWork Validation Framework 的声明式验证: ...

  6. DynamicData for Asp.net Mvc留言本实例 中篇 新建.删除.数据验证

    上篇咱完成了显示列表的功能,下面接着来 也许您有疑问,这个显示列表不是和正常的Asp.net Mvc差不多吗?也是个foreach只是由原来的<%=字段%>变成了<% Html.Re ...

  7. [翻译-ASP.NET MVC]Contact Manager开发之旅迭代3 - 验证表单

    本翻译系列为asp.net mvc官方实例教程.在这个系列中,Stephen Walther将演示如何通过ASP.NET MVC framework结合单元测试.TDD.Ajax.软件设计原则及设计模 ...

  8. vue开发,iview日期选择验证

    使用iview框架进行vue开发过程中遇见的零散问题(1) rules中绑定自定义的验证规则 <Form ref="formValidate" :model="fo ...

  9. vue表单验证,多种校验规则

    前言 vue 表单验证,具体的大家根据自身项目和框架来,本文以antd举例. 实现 这里以antd 举例 <template><a-form-model ref="rule ...

最新文章

  1. 未来黑客入侵的不仅有电脑,还有人脑?
  2. 对矩阵分解的粗浅理解之LU分解
  3. canal能监控多个mysql_learning-mysql-canal
  4. .net你不行——是你的父亲把你封装的太死,还是你的子孙们太懒,未把你发扬光大。...
  5. 外星人入侵 python 飞船位置_《python从入门到实践》项目一:外星人入侵
  6. 页面间的跳转,打开,关闭小技巧.
  7. 2019最新 Java商城秒杀系统的设计与实战视频教程(SpringBoot版)
  8. [html] HTML为什么要语义化?语义化有什么好处?
  9. 《深入理解Nginx:模块开发与架构解析》一1.6 Nginx的命令行控制
  10. 最新!全球学术排名出炉:22所中国大学位居世界100强
  11. ipq4029 高通 芯片 openwrt 资料收集
  12. 新版码支付个人免签支付系统源码+实测成功
  13. 全外显子组生信分析流程-4-数据质控
  14. window.open 卡死
  15. 压降不同的二极管并联
  16. win10计算机方差,标准差计算工具
  17. 前端 js 深浅拷贝
  18. LeetCode1619删除某些元素后的数组均值(java)
  19. 如何使用云桌面进行开发?
  20. 一个简单的文本编辑器。(是在DEV C++下写的)

热门文章

  1. MySQL之建表时[Err] 1050 - Table ‘users‘ already exists异常解决方法
  2. linux下的通配符与特殊符号
  3. Excel_VBA开发2048游戏教程——Einsphoton
  4. PCIe ARI (Alternative Routing-ID Interpretation)介绍
  5. Jmeter 之 Beanshell 用法
  6. 盛迈坤电商:店铺详情页设置的特点
  7. 业务:pdf转图片问题(解决非标准pdf转图片空白问题)
  8. svn update 出现skipped '.' 或skipped '目录名称'
  9. Springboot整合SpringSecurity 04-启用登出logout功能
  10. win10 windows文件查找通配符