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验证(二)的更多相关文章
-
详解ASP.NET MVC Model验证
ASP.NET mvc的最好的优点之一就是支持Model验证,这个特性很方便你可以选择在定义Model的时候在字段中采用特性进行注解约定,也可以在代码中自己进行手动验证.下面就来细说一下ASP.NET ...
-
ASP.NET MVC Model验证(五)
ASP.NET MVC Model验证(五) 前言 上篇主要讲解ModelValidatorProvider 和ModelValidator两种类型的自定义实现, 然而在MVC框架中还给我们提供了其它 ...
-
ASP.NET MVC Model验证(四)
ASP.NET MVC Model验证(四) 前言 本篇主要讲解ModelValidatorProvider 和ModelValidator两种类型的自定义实现,前者是Model验证提供程序,而Mod ...
-
ASP.NET MVC Model验证(三)
ASP.NET MVC Model验证(三) 前言 上篇中说到在MVC框架中默认的Model验证是在哪里验证的,还讲到DefaultModelBinder类型的内部执行的示意图,让大家可以看到默认的M ...
-
ASP.NET MVC Model验证(一)
ASP.NET MVC Model验证(一) 前言 前面对于Model绑定部分作了大概的介绍,从这章开始就进入Model验证部分了,这个实际上是一个系列的Model的绑定往往都是伴随着验证的.也会在后 ...
-
ASP.NET MVC Model绑定(二)
ASP.NET MVC Model绑定(二) 前言 上篇对于Model绑定的简单演示想必大家对Model绑定的使用方式有一点的了解,那大家有没有想过Model绑定器是在什么时候执行的?又或是执行的过程 ...
-
ASP.NET MVC Model元数据(二)
ASP.NET MVC Model元数据(二) 前言 在上篇中,给大家留个对Model元数据的印象,并没有对Model元数据有过多的讲解,而在本篇中也不会对Model元数据的本身来解释,而是针对于它的 ...
-
【转】【Asp.Net MVC】asp.net mvc Model验证总结及常用正则表达式
本文属转载,来源: http://www.byywee.com/page/M0/S868/868615.html 关于Model验证官方资料: http://msdn.microsoft.com/zh ...
-
【Asp.Net MVC】asp.net mvc Model验证总结及常用正则表达式
转自:http://www.cnblogs.com/easy5weikai/p/3843131.html 关于Model验证官方资料: http://msdn.microsoft.com/zh-cn/ ...
随机推荐
-
Git命令----放弃本地修改使用服务器上的代码
git reset --hard FETCH_HEAD FETCH_HEAD表示上一次成功git pull之后形成的commit点.
-
在使用开源library的PullToRefreshView中
下拉刷新几乎是每个应用都会有的功能,且大部分用的都是开源项目,下载地址:下拉刷新.如何在页面刚打开的时候自动触发下拉刷新的呢? 只需要一句代码,在PullToRefreshAdapterView Ba ...
-
objc_msgSend()报错Too many arguments to function call ,expected 0,have3
Build Setting--> Apple LLVM 6.0 - Preprocessing--> Enable Strict Checking of objc_msgSend Call ...
-
通过解析PE头。读取dll模块 和 dll模块函数
win32 int main(){ //001e1000 ::MessageBox(NULL, TEXT("111"), TEXT("222"), 0); HM ...
-
如何在VS2013中新建WindowsService定时任务
http://jingyan.baidu.com/article/cd4c2979e9330d756f6e6070.html 很多人都想做定时任务,但是没有不知道如何下手,现在就用WindowsSer ...
-
一个简单的Hibernate工具类HibernateUtil
HibernateUtil package com.wj.app.util; import org.hibernate.Session; import org.hibernate.SessionFac ...
-
Python解析JSON详解
JSON 函数 使用 JSON 函数需要导入 json 库:import json. 函数 描述 json.dumps 将 Python 对象编码成 JSON 字符串 json.loads 将已 ...
-
Python构建发布
click python配置apache的web服务器方法(python的CGI配置) python中的编码问题 http://blog.csdn.net/wyb_hardworking/articl ...
-
配置vscode同步大神玺哥的配置
1.应用商店下载settings sync 2.三键 ctrl + shift + p 对话框中输入sync:点击重置 3.ctrl + shift + p 点击下载 4.然后会自动的调整到g ...
-
转--python -- 收发邮件
官方 import smtplib from email.mime.text import MIMEText from email.header import Header # 发送邮箱服务器 smt ...