获取ValueProvider
ValueProvider用于提供数据,此处直接使用Controller中的ValueProvider:
而Controller中的ValueProvider是遍历所有ValueProviderFactory根据Controller上下文创建的一个提供器集合:
一般来说所有的提供器都会被创建,如下图的FormValue提供器,只要Controller上下文不为空就会有:
但是Json提供器比较特殊,需要请求内容为Json格式并能够正确反序列化才会创建,这也就解释了文章开始时只有发送Json请求时才会有Json值提供器存在的问题,下面是Json值提供器创建的代码,必须保证反序列化的对象不为空才会将该提供器保存到字典中:
而反序列化GetDseserializedObject方法,则是需要请求类型为Json,才会进行反序列化工作:
创建ModelMetadata
ModelMetadata是用来描述模型的元数据,在进行模型绑定时元数据被包含在模型绑定上下文(ModelBindingContext)对象中,这个上下文对象除了模型元数据外,还包含属性过滤器以及模型名称等信息。
而代码显示元数据获取实际上是通过一个元数据提供器的组件完成的其代码如下:
根据代码分析,实际上使用了一个名为CachedDataAnnotationsModelMetadataProvider的元数据提供器,其获取Metadata的代码如下:
先获取特性列表,然后通过该特性列表创建Metadata,获取特性很好理解,而创建Metadata的核心代码如下(部分),它实例化一个元数据对象后,通过在特性列表中查找特定的特性然后赋值的方式实现了元数据的创建:
注:实际上ASP.NET MVC中将元数据特性分为以下几种,除了数据类型、必填等属性外,还包含了很多用于展示的特性,这些展示特性将在渲染View的时候使用,更多内容也将在后续介绍:
另外ASP.NET MVC中默认使用基于缓存机制的元数据组件以提高性能,相关类型如下图所示,本文不再详解:
模型绑定
当完成以上步骤后,将通过最开始获取的ModelBinder通过ControllerContext(包含请求数据)以及BindingContext(包含值提供器、模型信息等数据)完成模型绑定。之前也介绍过ModelBinder是根据参数的类型来获取的,比如对于文件数据将会使用HttpPostedFileBaseModelBinder类型来完成,如下图代码就是文件模型绑定的代码: