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侦测到。
展开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-自定义验证规则、日期范围验证相关推荐
- ASP.NET MVC如何实现自定义验证(服务端验证+客户端验证)
ASP.NET MVC通过Model验证帮助我们很容易的实现对数据的验证,在默认的情况下,基于ValidationAttribute的声明是验证被使用,我们只需要将相应的ValidationAttri ...
- excel学习笔记:数据格式,单元格格式(快捷键,自动调整行列宽,条件格式,自定义格式,日期星期时间的设置,特殊数字,多种填充方式,从下拉列表选择,数据验证。)
文章目录 数据格式.单元格格式 1. 快捷键 2. 自动调整列/行宽 3. 条件格式 4. 日期设置 5. 星期设置 6. 时间设置 7. 特殊数字 8. 选中多个填充,ctrl选中,输入100,ct ...
- 后盾网lavarel视频项目---自定义验证和自定义验证规则
后盾网lavarel视频项目---自定义验证和自定义验证规则 一.总结 一句话总结: 1.自定义验证就是用的自定义验证请求类:php artisan make:request AdminPost 2. ...
- java注解定义时间格式_SpringBoot基础教程2-1-8 数据验证-自定义日期格式验证
1 概述 javax.validation包与hibernate-validator包中注解能满足大部分需求,但是还是有必要熟悉下自定义数据验证注解,如日期格式验证. 2 添加依赖 org.sprin ...
- 9、 Struts2验证(声明式验证、自定义验证器)
1. 什么是Struts2 验证器 一个健壮的 web 应用程序必须确保用户输入是合法.有效的. Struts2 的输入验证 基于 XWork Validation Framework 的声明式验证: ...
- DynamicData for Asp.net Mvc留言本实例 中篇 新建.删除.数据验证
上篇咱完成了显示列表的功能,下面接着来 也许您有疑问,这个显示列表不是和正常的Asp.net Mvc差不多吗?也是个foreach只是由原来的<%=字段%>变成了<% Html.Re ...
- [翻译-ASP.NET MVC]Contact Manager开发之旅迭代3 - 验证表单
本翻译系列为asp.net mvc官方实例教程.在这个系列中,Stephen Walther将演示如何通过ASP.NET MVC framework结合单元测试.TDD.Ajax.软件设计原则及设计模 ...
- vue开发,iview日期选择验证
使用iview框架进行vue开发过程中遇见的零散问题(1) rules中绑定自定义的验证规则 <Form ref="formValidate" :model="fo ...
- vue表单验证,多种校验规则
前言 vue 表单验证,具体的大家根据自身项目和框架来,本文以antd举例. 实现 这里以antd 举例 <template><a-form-model ref="rule ...
最新文章
- 未来黑客入侵的不仅有电脑,还有人脑?
- 对矩阵分解的粗浅理解之LU分解
- canal能监控多个mysql_learning-mysql-canal
- .net你不行——是你的父亲把你封装的太死,还是你的子孙们太懒,未把你发扬光大。...
- 外星人入侵 python 飞船位置_《python从入门到实践》项目一:外星人入侵
- 页面间的跳转,打开,关闭小技巧.
- 2019最新 Java商城秒杀系统的设计与实战视频教程(SpringBoot版)
- [html] HTML为什么要语义化?语义化有什么好处?
- 《深入理解Nginx:模块开发与架构解析》一1.6 Nginx的命令行控制
- 最新!全球学术排名出炉:22所中国大学位居世界100强
- ipq4029 高通 芯片 openwrt 资料收集
- 新版码支付个人免签支付系统源码+实测成功
- 全外显子组生信分析流程-4-数据质控
- window.open 卡死
- 压降不同的二极管并联
- win10计算机方差,标准差计算工具
- 前端 js 深浅拷贝
- LeetCode1619删除某些元素后的数组均值(java)
- 如何使用云桌面进行开发?
- 一个简单的文本编辑器。(是在DEV C++下写的)
热门文章
- MySQL之建表时[Err] 1050 - Table ‘users‘ already exists异常解决方法
- linux下的通配符与特殊符号
- Excel_VBA开发2048游戏教程——Einsphoton
- PCIe ARI (Alternative Routing-ID Interpretation)介绍
- Jmeter 之 Beanshell 用法
- 盛迈坤电商:店铺详情页设置的特点
- 业务:pdf转图片问题(解决非标准pdf转图片空白问题)
- svn update 出现skipped '.' 或skipped '目录名称'
- Springboot整合SpringSecurity 04-启用登出logout功能
- win10 windows文件查找通配符