这样的验证看上去多美——在参数上应用验证特性

如果可以把基于特性的Model验证应用在参数就好了,如图:

通过右键查看定义,可以明显看出RangeAttribute是可以应用在参数上的,如图:

看到这里有木有很嗨皮,就这么简单就是实现了,咳咳如果这样就完了,那我还写这篇干嘛呢,嘻嘻..

其实这样是不会执行验证的,验证永远都是通过的,不信看图(有图才有真相):

那为啥可以应用在参数上,但是就是不执行验证呢?不要着急请听我慢慢道来。

是这样的:模型验证是在模型绑定的时候执行的,验证信息都是保存在了ModelMetadata里(看下面的图),里面只包含一些模型的验证和一起洗其他与模型相关的信息,我们定义的参数的特性属于参数信息,并不在模型元数据里面,所以验证的时候根本就没有我们定义的特性验证信息。

ModelMetadata

说道这里一切的原因都清楚,要想实现基于特性的验证应用在参数,就是简简单单把我们定义的特性放进模型元数据里就行了啊。

第一步:把参数上的特性保存起来

要想获取参数特性可以通过ParameterDescriptor来得到,如图

要想获取ParameterDescriptor可以通过ControllerActionInvoker的GetParameterValue方法获取。如图

我们通过GetparameterValue方法,把参数parameterDescription保存在路由里。

上图我们是实现了一个自定义的ActionInvoker。在Controller里有一个CreateActionInvoker方法是用来创建ActionInvoker,我们重写这个方法返回我们自定义的ActionInvoker,如图

至此参数的信息已经被我们保存起来。

第二步:把参数的特性生成ModelValidator

我们自定义一个ModelValidatorProvider来提供ModelValidator如图

ModelValidator是由ModelValidatorProvider来提供,所以我继承了DataAnnotationsModelValidatorProvider,在重写的GetValidators方法中我们将之前保存的ParameterDescriptor提取出来,从中获取attribute与已有的attributes合并,生成ModelValidator。

此刻参数上的特性已经生成ModelValidator,并保存在ModelMetadata中

第三不:注册ParameterValidationModelValidatorProvider

在注册ParameterValidationModelValidatorProvider之前需要将现有的DataAnnotationsModelValidatorProvider移除。如图:

此刻其实参数验证还是不会有效果的,原因是模型绑定是模型验证不会对简单类型实施验证。所以我要自定义一个模型绑定。

第四部:自定义模型绑定

我们继承了默认的模型绑定,重写BindModel方法,如果是复杂类型或者model为null,就直接返回model,应为我们这个只是针对简单类型验证。空也没必要验证。

第五部:实例演示,如图

ps:感谢蒋金楠老师的博客http://www.cnblogs.com/artech/archive/2012/06/11/data-annotations-model-validation-04.html

时间: 2024-08-24 23:14:35

这样的验证看上去多美——在参数上应用验证特性的相关文章

ASP.NET MVC基于标注特性的Model验证:将ValidationAttribute应用到参数上

原文:ASP.NET MVC基于标注特性的Model验证:将ValidationAttribute应用到参数上 ASP.NET MVC默认采用基于标准特性的Model验证机制,但是只有应用在Model类型及其属性上的ValidationAttribute才有效.如果我们能够将ValidationAttribute特性直接应用到参数上,我们不但可以实现简单类型(比如int.double等)数据的Model验证,还能够实现“一个Model类型,多种验证规则”,本篇文章将为你提供相关的解决方案(源代码

jquery validation remote进行唯一性验证时只使用自定义参数,不使用默认参数

在使用validation进行唯一性验证时,想各个模块写一个统一的方法,相统一参数名称,但是remote方法会默认把对应的参数传过去 如: 会把role.roleName默认作为变量提交过去 所以想自定义统一的参数,不想把默认参数传递过去 但是validation插件似乎不支持,只好看源码了 所以,既不影响其原来格式的使用,又能够对其进行扩展自定义参数(若是自定义参数,默认参数就不起作用),就修改了其源码 在页面上使用方式如下: 服务端只需在baseAction里使用: jquery valid

一文看懂命令行参数的用法——Python中的getopt神器

一文看懂命令行参数的用法--Python中的getopt神器 参考原文:Python模块之命令行参数解析 - 每天进步一点点!!! - 博客园 https://www.cnblogs.com/madsnotes/articles/5687079.htmlpython getopt使用 - tianzhu123的专栏 - CSDN博客 https://blog.csdn.net/tianzhu123/article/details/7655499在运行程序时,可能需要根据不同的条件,输入不同的命令

【Block-Level Verification】 芯片开发通识_验证目标_ 验证语言_ 验证职业前景 _挑战和瓶颈_验证周期_功能描述文档_验证计划_回归测试_硅后测试_逃逸分析

SystemVerilog验证通识 1. 芯片开发概述 不同于通用电路,专用集成电路为了专门解决或者优化相关工程问题,例如专用算法的电路实现,如芯片里加入人工智能处理单元,为CPU\GPU减负,目的是提高应用效率和降低能耗. 芯片体积有多大?2017年5月 一款芯片采用12nm FFN 工艺,核心面积为惊人的815平方mm,一共包含211亿个晶体管.大于10亿门为大型SOC,现在非常多,一款4G 芯片大约为40-50亿门. 28nm流片价格为 200万美金,14nm double,7nm dou

文件上传验证绕过技术总结

文件上传验证绕过技术总结 1.客户端验证绕过 很简单啦,直接使用webscarab或者burp修改一下后缀名就行. 2.服务端验证绕过-Content-type检测 若服务端检测文件类型时是检测Content-type的值,也很简单,在webscarab或者burp中修改Content-type. 如php中 if($_FILES['userfile']['type'] != "image/gif") 即是检测Content-type值. 3.服务端验证绕过-扩展名检测 a. 寻找漏网

上传验证绕过

上传验证绕过 2011-08-06 07:37:10     我来说两句      收藏    我要投稿 Bypass Upload Validation Framework V0.9 CasperKid[S.Y.C] 2011.7.29 目录0x01  客户端验证绕过(javascript 扩展名检测)0x02  服务端验证绕过(http request 包检测)- Content-type (Mime type)  检测0x03  服务端验证绕过(扩展名检测)- 黑名单检测- 白名单检测-

ASP.NET MVC验证 - 自定义验证规则、验证2个属性值不等【待验证】

提示:保存后才提示错误信息 自定义验证特性,继承ValidationAttribute并实现IClientValidatable 这次重写了基类的IsValid()方法的另外一个重载,因为该重载包含了验证上下文ValidationContext,从中可以获取属性及属性值. using System.ComponentModel.DataAnnotations; using System.Globalization; using System.Web.Mvc; namespace MvcValid

上传验证绕过全解析

目录 0x01  客户端验证绕过(javascript 扩展名检测)0x02  服务端验证绕过(http request 包检测) - Content-type (Mime type)  检测 0x03  服务端验证绕过(扩展名检测) - 黑名单检测 - 白名单检测 - .htaccess 文件攻击 0x04  服务端验证绕过(文件完整性检测) - 文件头检测 - 图像大小及相关信息检测 - 文件加载检测 0x05  各种情况下的检测绕过分析0x06  关于图像代码注入后的解析简答 前言在现在越

利用线上数据验证系统 Gor

Web 应用性能和压力测试工具 Gor - 运维生存时间 http://hao.jobbole.com/gorhttp/ 要使用线上引流到测试环境的作用,需要做到以下几点: 1.新搭建一套测试环境,连接一套新的数据库,这个库里的数据为线上备份数据 但要保证这套环境与线上环境完全隔离,隔离的内容包括:短信发送,微信通知 2.每次上线之前将最新的代码部署在这套预环境中,使用gor进行导流,查看日志中是否进行了报错.经过一小时无错误,则可以进行上线操作 可以更好的验证系统的稳定性 3.做完验证后,清除