ASP.NET MVC Model验证()

前言

上篇内容演示了一个简单的Model验证示例,然后在文中提及到Model验证在MVC框架中默认所处的位置在哪?本篇就是来解决这个问题的,并且会描述一下ModelValidator类型对象相关的类型。

Model验证

  • Model验证简单运用示例
  • ModelValidator使用生成过程
  • 自定义实现DefaultModelBinder进行验证
  • 自定义ModelValidatorProvider 和ModelValidator 
  • ValidationAttribute特性类使用
  • 自定义ValidationAttribute特性类的示例实现

 

ModelValidator使用生成过程

首先请允许我“盗”一张图,这个示意图是在我前面篇幅的ASP.NET MVC Model绑定(二)中的一张图。

图1

为什么要“盗”这个图1,因为Model验证的过程将是在这个图中的某个位置,对于这个示意图的意思我就不详细说明了,只说明一下蓝色线条部分,那是Model绑定器生成部分,我们需要的也是这个部分。看下图2

图2

图2的部分也是图1中的,这样一步步的分解下来,让大家有个由大到小的由远到近的层次感,便于记忆和留下印象。这里有的朋友会说了这是Model绑定部分拉过来有什么用?这个是有用的,看一下【IModelBinder.BindModel()】这个部分到【获取控制器方法参数值】部分,也就是整个Model绑定的过程了,主题是Model验证又扯绑定了,没办法阿,因为在Model绑定之前会进行Model验证。

在我们没有自定义Model绑定器的时候,系统默认实现的都是DefaultModelBinder类型,那么我就来看一下DefaultModelBinder类型的内部的具体实现吧。。。

开个玩笑,是看一下内部实现不过不是源码而是示意图(图3),这样给大家留个印象,感兴趣的自己去扒源码看吧。

图3

感觉是不是有点坑,别急大家,坑谁不敢坑你们,实际上还有一条流程这里没有显示,这里显示就是绑定复杂类型的Model所要执行的内部方法。而在BindComplexModel)(方法内部的实现里才会进行Model验证,我们看一下方法的内部执行示意图(图4)。

图4

长话短说,执行Model验证的过程是先执行Model中的属性级验证,然后执行Model级验证。

在BindComplexElementalModel()方法中,首先会执行BindProperties()方法,在此方法内部会遍历PropertyDescriptor集合类型(图4中显示PropertyDescriptorCollection是不足的地方),正如大家所看到的一样,SetProperty()方法才是最后真正对Model属性进行验证的函数(下个篇幅会有讲解实现自定义的Model绑定器执行Model验证会讲到这个方法)。

而在SetProperty()方法中真正执行验证的,可以是自定义的,当然了系统默认的就是从ModelValidatorProviders.Providers中获取的了,所有验证的后的错误信息(假使有)都存在了ModelBindingContext类型的参数中了,以此向下传递。

验证完Model属性后则会验证Model本身,就会调用OnModelUpdated()方法,这个方法有个毛病,就是自己不干活,在它内部使用CompositeModelValidator类型的实例来进行验证,不过验证最后使用的还是ModelValidatorProviders.Providers中我们自定义的ModelValidator类型或者是默认的(这里具体的细节本人也没有去细看,大概的流程是这样如果有误差请指正,感激不尽)。

最后我们说一下ModelValidator类型的注册,首先系统是不认它的,它可能不是“亲生”的。系统的ModelValidatorProviders类型中的Providers属性是ModelValidatorProviderCollection类型的,这下大家应该看到系统认谁了吧,就是认识ModelValidator类型的“爹”ModelValidatorProvider类型(毕竟不是继承关系),这里就不多说相关的模型了,跟前面好多的模型都相像。

对于自定义实现ModelValidator类型的示例演示在后续的篇幅中会有讲到。

作者:金源

出处:http://www.cnblogs.com/jin-yuan/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面

ASP.NET MVC Model验证(二)的更多相关文章

  1. 详解ASP.NET MVC Model验证

    ASP.NET mvc的最好的优点之一就是支持Model验证,这个特性很方便你可以选择在定义Model的时候在字段中采用特性进行注解约定,也可以在代码中自己进行手动验证.下面就来细说一下ASP.NET ...

  2. ASP.NET MVC Model验证(五)

    ASP.NET MVC Model验证(五) 前言 上篇主要讲解ModelValidatorProvider 和ModelValidator两种类型的自定义实现, 然而在MVC框架中还给我们提供了其它 ...

  3. ASP.NET MVC Model验证(四)

    ASP.NET MVC Model验证(四) 前言 本篇主要讲解ModelValidatorProvider 和ModelValidator两种类型的自定义实现,前者是Model验证提供程序,而Mod ...

  4. ASP.NET MVC Model验证(三)

    ASP.NET MVC Model验证(三) 前言 上篇中说到在MVC框架中默认的Model验证是在哪里验证的,还讲到DefaultModelBinder类型的内部执行的示意图,让大家可以看到默认的M ...

  5. ASP.NET MVC Model验证(一)

    ASP.NET MVC Model验证(一) 前言 前面对于Model绑定部分作了大概的介绍,从这章开始就进入Model验证部分了,这个实际上是一个系列的Model的绑定往往都是伴随着验证的.也会在后 ...

  6. ASP.NET MVC Model绑定(二)

    ASP.NET MVC Model绑定(二) 前言 上篇对于Model绑定的简单演示想必大家对Model绑定的使用方式有一点的了解,那大家有没有想过Model绑定器是在什么时候执行的?又或是执行的过程 ...

  7. ASP.NET MVC Model元数据(二)

    ASP.NET MVC Model元数据(二) 前言 在上篇中,给大家留个对Model元数据的印象,并没有对Model元数据有过多的讲解,而在本篇中也不会对Model元数据的本身来解释,而是针对于它的 ...

  8. 【转】【Asp.Net MVC】asp.net mvc Model验证总结及常用正则表达式

    本文属转载,来源: http://www.byywee.com/page/M0/S868/868615.html 关于Model验证官方资料: http://msdn.microsoft.com/zh ...

  9. 【Asp.Net MVC】asp.net mvc Model验证总结及常用正则表达式

    转自:http://www.cnblogs.com/easy5weikai/p/3843131.html 关于Model验证官方资料: http://msdn.microsoft.com/zh-cn/ ...

随机推荐

  1. 解决cookie跨域访问

    一.前言 随着项目模块越来越多,很多模块现在都是独立部署.模块之间的交流有时可能会通过cookie来完成.比如说门户和应用,分别部署在不同的机器或者web容器中,假如用户登陆之后会在浏览器客户端写入c ...

  2. ASP.NET Core应用针对静态文件请求的处理[4]: DirectoryBrowserMiddleware中间件如何呈现目录结构

    和StaticFileMiddleware中间件一样,DirectoryBrowserMiddleware中间本质上还是定义了一个请求地址与某个物理目录之间的映射关系,而目标目录体现为一个FilePr ...

  3. UE4新手引导入门教程

    请大家去这个地址下载:file:///D:/UE4%20Doc/虚幻4新手引导入门教程.pdf

  4. [Egret]优雅的写http

    首先,自从使用链式调用的写法后,就一发不可收拾的喜爱上了这种优雅的方式.不管是写架构还是写模块,我都会不自觉的使用这种最优雅的方式.链式写法既减少了代码量,又非常优雅的. 在使用 egret 的htt ...

  5. cesium自定义气泡窗口infoWindow

    一.自定义气泡窗口与cesium默认窗口效果对比: 1.cesium点击弹出气泡窗口显示的位置固定在地图的右上角,默认效果: 2.对于习惯arcgis或者openlayer气泡窗口样式的giser来说 ...

  6. Android 在Android代码中执行命令行

    1.路径最好不要是自己拼写的路径/mnt/shell/emulated/0/wifidog.conf 最好是通过方法获取的路径,不然可能导致命令无效  (挂载点的原因) public static f ...

  7. 信息安全-1:python之playfair密码算法详解[原创]

    转发注明出处: http://www.cnblogs.com/0zcl/p/6105825.html 一.基本概念 古典密码是基于字符替换的密码.加密技术有:Caesar(恺撒)密码.Vigenere ...

  8. win10系统下连接无线网络掉线问题解决办法

    打开驱动精灵----系统诊断 找一个可修复的驱动点击 选择连不上网中的查看更多 有连不上网络,网络连接受限,解决无线间歇性掉网问题 进入计算机管理----设备管理 修改无线网络属性(名称含有wirel ...

  9. 将MPM雪模拟移植到Maya

    同事实现了一个迪士尼的MPM雪模拟论文,我将其移植到Maya中 论文题目是 A material point method for snow simulation 代码在这里: https://git ...

  10. XSS 前端防火墙 —— 天衣无缝的防护

    上一篇讲解了钩子程序的攻防实战,并实现了一套对框架页的监控方案,将防护作用到所有子页面. 到目前为止,我们防护的深度已经差不多,但广度还有所欠缺. 例如,我们的属性钩子只考虑了 setAttribut ...