基于标记特性的Model验证,真的太棒了,与jquery validate结合后激情四射,有木有,一句话完成前后端验证。简直让人秒爱...

但是爱是爱了,生活中总会有些小摩擦,这不问题来了:看图中那个Num,假如我在别处也要用到这个Test,但是Num的范围变了。哎呀怎么办呢,难道要重新建一个Test1吗...

其实解决这个问题不难,只要在上面再添加一个验证就可以了,然后在用到这个Test的地方“选择”你想用的那个一个验证就OK了。看图:

这样一切就搞定了。但是如果你真的就这样写了会发现编译不通过,因为默认是没有实现这个功能的哦

所以接下来我们看看如何才能实现这样的效果

关键就在它:DataAnnotationsModelValidatorProvider,MVC里有好多Provide,他们都扮演者重要的角色,一直默默的在捡肥皂无怨无悔。

在这里DataAnnotationsModelValidatorProvider为模型验证提供了验证所需要的验证规则,他们就好像是一包雀巢咖啡供别人用热水冲开散发错香味。

既然DataAnnotationsModelValidatorProvider为模型验证提供了验证规则,我们只需要对他做些手脚就可以了,把我们不想要那些验证规则去掉就行,所以我们要继承他实现一个ValidatorProvide。

问题又来了,那代码怎么才能知道那些是不需要的验证规则呢。关键就在Action上的标记,只要我们获取那个标记就行了。接下来我们要做这样几件事情:1、自定义一个验证规则,2、自定义一个验证规则标记

3,获取自定义验证规则保存起来,在ValidatorProvide里获取。

自定义验证规则:

这就是用来做验证的标记,它继承了一个自定义的验证标记ValidatorAttribute

自定义验证标记 ValidatorAttribute:

看这里我们重写了TypeId属性,为了是每一次使用自定义验证规则时都是一个“全新的”,当我们一次使用多个时,每一个都是有效的。(在后面会有针对TypeId“过滤”)

自定义规则标记:

用于放在Action 和Controller上,确定我们需要哪一个自定义验证规则。

获取自定义规则标记保存:

要想获取自定义规则标记保存,就要从ControllerDescriptors和ActionDescriptor下手,从他们那里我们可以获取controller和action的相关描述信息。

我们所要的一切都可以在Controller类里获取,所以我们继承了他并自定义了一个。

在ControllerDescriptor属性里通过反射获取ControllerDescriptors,为了性能考虑我们把结果缓存了起来。(棒棒哒)

BeginExecuteCore和ExecuteCore是调用当前控制器上下文中的一些操作,一个是异步的操作一个是同步的操作。

SetValidationRule,这里面我们获取到的自定义规则标记保存到路由数据里

自定义一个DataAnnotationsModelValidatorProvider:

从路由数据里获取自定义规则标记,过滤一下attributes,去掉不需要的验证规则。

FilterAttributes是用来过滤的,先去掉所有的验证标记,然后根据自定义规则标记(要用的标记名称),在attributes里过滤出自定义规则标记的验证规则。

最后在模型验证程序提供程序集合里添加RuleBaseValidatorProvide

首先去掉已有DataAnnotationsModelValidatorProvider,然后再添加

PS:感谢蒋金楠的系列博客 http://www.cnblogs.com/artech/archive/2012/06/12/data-annotations-model-validation-05.html

本文知识点都是来源于蒋金楠老师的博客

把多种验证规则用到一个model上的更多相关文章

  1. ASP.NET MVC基于标注特性的Model验证:一个Model,多种验证规则

    原文:ASP.NET MVC基于标注特性的Model验证:一个Model,多种验证规则 对于Model验证,理想的设计应该是场景驱动的,而不是Model(类型)驱动的,也就是对于同一个Model对象, ...

  2. Thinkphp 1.验证规则 2.静态定义 3.动态验证

    一.验证规则 数据验证可以对表单中的字段进行非法的验证操作.一般提供了两种验证方式: 静态定 义($_validate 属性)和动态验证(validate()方法). //验证规则 array( ar ...

  3. MVC验证04-自定义验证规则、日期范围验证

    原文:MVC验证04-自定义验证规则.日期范围验证 本文体验范围验证.与本文相关的包括: MVC验证01-基础.远程验证   MVC验证02-自定义验证规则.邮件验证   MVC验证03-自定义验证规 ...

  4. Model中的验证规则

    一.能够使用Model的Attribute进行服务端数据验证 本文目录 一.概述 二.MVC提供的常用上下文 三.自定义正则表达式验证 一.概述 为了确保数据的安全性,由Client发送到服务端的每一 ...

  5. 爱上MVC3~为下拉列表框添加一个自定义验证规则

    回到目录 开发它的原因: 之前的同事,也是我的哥们,问我下拉列表框是否可以支持验证,这个问题看似简单,但确实MVC里有为我们提供,所以,只能自己写个扩展了,即自己写一个attribute特性,让它继承 ...

  6. mvc中动态给一个Model类的属性设置验证

    原文:mvc中动态给一个Model类的属性设置验证 在mvc中有自带的验证机制,比如如果某个字段的类型是数字或者日期,那么用户在输入汉字或者英文字符时,那么编译器会自动验证并提示用户格式不正确,不过这 ...

  7. FluentValidation:一个非常受欢迎的,用于构建强类型验证规则的.NET 库

    1. FluentValidation:一个非常受欢迎的,用于构建强类型验证规则的.NET 库 请求参数实体定义: FluentValidation 验证类定义: 过滤器:ActionFilter中O ...

  8. Jquery Validate自定义验证规则,一个汉字等于两个字符长度

    使用Jquery validate时写的一些东西,在这里做个笔记 在使用 Jquery validate 的minlength和maxlength进行文本框内容长度验证的时候,对于一个汉字的长度检测结 ...

  9. Asp.net MVC验证哪些事(2)-- 验证规则总结以及使用

    上篇文章Asp.net MVC验证那些事(1)-- 介绍和验证规则使用中,介绍了Asp.net MVC中的验证功能以及如何使用.这里将对MVC中内置的验证规则进行总结. 一,查找所有验证规则 上篇文章 ...

随机推荐

  1. 【BZOJ1014】火星人prefix(splay,Hash)

    题意: . 思路: ; ..,..]of longint; sum,size,fa,a,b,id,mi:..]of longint; n,m,i,x,y,s,k,j,cnt,root:longint; ...

  2. 洛谷—— P2047 社交网络

    P2047 社交网络 题目描述 在社交网络(social network)的研究中,我们常常使用图论概念去解释一些社会现象.不妨看这样的一个问题.在一个社交圈子里有n个人,人与人之间有不同程度的关系. ...

  3. 1267 老鼠的旅行 2012年CCC加拿大高中生信息学奥赛

    1267 老鼠的旅行  2012年CCC加拿大高中生信息学奥赛 题目描述 Description You are a mouse that lives in a cage in a large lab ...

  4. HTTP状态码图示

    这里总结下我们日常开发中常用的HTTP状态码,分享一个老外对HTTP状态码形象化用图片表示的网站:https://http.cat/ 总结如下: 表示服务器已经接收到了请求头,并且客户端应该继续发送请 ...

  5. 京东电商API

    大家好~~2016年了~转眼过去三年了...一年没有更新博客了.. ..在上一年里,遇到了几个好哥们,一起写程序一起装逼,以下给大家讲述一下工作上遇到的技术问题,由于这个我開始弄的时候也比較麻烦,不知 ...

  6. 扩展VirtualBox中的centos硬盘大小

    一.克隆文件 我之前安装的时候建的是centos 6.3.可是后来空间不够,没办法,又不想重装centos.由于好多东西要配置,特麻烦,所以先想到了使用resize命令,可是在win8中运行D:\Pr ...

  7. Go/Python/Erlang编程语言对比分析及示例 基于RabbitMQ.Client组件实现RabbitMQ可复用的 ConnectionPool(连接池) 封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil 分享基于MemoryCache(内存缓存)的缓存工具类,C# B/S 、C/S项目均可以使用!

    Go/Python/Erlang编程语言对比分析及示例   本文主要是介绍Go,从语言对比分析的角度切入.之所以选择与Python.Erlang对比,是因为做为高级语言,它们语言特性上有较大的相似性, ...

  8. LNMP环境搭建——PHP篇

    一.源代码安装 1.编译安装 ./configure --prefix=/usr/local/php\ --with-config-file-path=/usr/local/php/etc --wit ...

  9. jeasyui-datagrid使用笔记

    formatter转换ID为值 设置字典缓存 var DictionaryItem = {}; $.post('/Dictionary/GetDictionary/T_RKXD', function ...

  10. coffeescript遍历json对象

    直接给代码: headers = a:"this is a" ,b:"this is b" ,c:"this is c" exheaders ...