把多种验证规则用到一个model上
基于标记特性的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
本文知识点都是来源于蒋金楠老师的博客