ASP.NET MVC Model绑定(二)

前言

上篇对于Model绑定的简单演示想必大家对Model绑定的使用方式有一点的了解,那大家有没有想过Model绑定器是在什么时候执行的?又或是执行的过程是什么样的?将在本篇为大家解除这些疑惑,在其中涉及到的一些描述类型和上下文参数会在后续的篇幅中讲到。

Model绑定

  • IModelBinder、自定义Model绑定器简单实现
  • Model绑定器在MVC框架中的位置
  • MVC中的默认Model绑定器生成过程
  • IModelBinderProvider的简单应用
  • IValueProvider在MVC框架中生成的位置以及过程
  • IValueProvider的应用场景
  • IValueProvider的实现之NameValueCollectionValueProvider

Model绑定器在MVC框架中的位置

不废话直接进入主题,Model绑定器顾名思义是为了Model的绑定提供帮助的这么一个功能模块,暂且就这么理解。Model这里所指的就是ViewModel,一般都是在控制器方法参数中使用Model,从而使Model绑定器可以使用起来,可是有没有想过为什么要这样用呢?世间的事物都是有因果的,当然这样的使用方式也逃脱不了,这跟MVC框架中生成Model绑定器的位置是有关系的,我们来看示意图1。

图1

看到图1,可能有的朋友可能觉得很突兀,这里建议朋友们先去看一下博主前面所写过的ASP.NET MVC过滤器系列的文章,看过的朋友肯定就会觉得很熟悉了,但也要考虑没有看过前面篇幅的朋友。

ControllerActionInvoker类型的InvokeAction()方法是MVC框架中执行控制器方法的必经方法,我们就按照图1所示的来讲解,黄色的指示线条为主要流程(虽然不是流程图)。首先MVC会生成一个ControllerDescriptor类型,然后根据ControllerDescriptor类型再生成ActionDescriptor类型,然后再根据ActionDescriptor类型生成FilterInfo类型的对象,对于ControllerDescriptor类型和ActionDescriptor类型分别表示着控制器描述类型(对象内部包含着控制器的各种信息)和控制器方法描述类型(同控制器描述类型一个意思),这两个类型的含义和生成过程后面篇幅会有讲解,这里暂时只需了解它们代表着什么就行。

对于FilterInfo类型的解释是它包含着当前所被调用的控制其方法上的所有过滤器信息(博主还是建议朋友们去看ASP.NET MVC过滤器系列的文章),从它的结构中可以看出它包含着各种类型过滤器类型集合对象属性。

重点来了,从图1中可以看出MVC框架会先执行授权认证IAuthorizationFilter过滤器,在执行完IAuthorizationFilter过滤器后和执行控制器行为过滤器IActionFilter之前,MVC会根据ActionDescriptor类型获取到ParameterDescriptor类型的对象【这里说句题外话看过前面Model元数据的朋友,想必知道ParameterDescriptor类型和Model元数据的都是用来描述Model的,ParameterDescriptor类型重在描述Model本身,而Model元数据更侧重于Model的外部修饰,感叹MVC的强大】。

然后再根据ParameterDescriptor类型中ParameterType属性,表示着Model的类型(Type类型)来生成Model绑定器(IModelBinder),至于生成的细节在下一小节来讲解,不能抢楼下的生意。

想必大家现在知道为什么要把ViewModel放在控制器方法中作为参数来使用了吧。

MVC中的默认Model绑定器生成过程

本小节讲解Model绑定器生成的具体过程,也不是太复杂,并且会在后续篇幅控制器方法执行篇幅会将这些知识点全部串联起来。

现在我们还是先看一下Model绑定器生成的细节吧,图2

图2

黑体字部分表示为属性名称,黑体字前面的青色表示属性类型,而在黑体字上面的表示属性所属类型

按照图2所示的来讲解,首先MVC调用了ControllerActionInvoker类型的GetModelBinder ()方法来生成IModelBinder类型,在方法的内部,MVC首先会判断参数parameterDescriptor中的BindingInfo属性中的Binder属性是否为空,如果为空的话(此部分内容在下篇中会详解ParameterDescriptor类型,并且以反推的方法来往上讲解几种描述类型),则是调用ControllerActionInvoker类型中的Binders属性。

现在我们就来看一下Binders属性的定义,如代码1-1。

代码1-1

        protected internal ModelBinderDictionary Binders
{
get
{
if (this._binders == null)
{
this._binders = ModelBinders.Binders;
}
return this._binders;
}
set
{
this._binders = value;
}
}

从代码1-1中可以清楚的看到,对于Binders属性的使用实际是在使用当前系统上下文中的ModelBinders.Binders属性,这里先暂停一下,我们看下ModelBinders.Binders属性中系统给默认提供的绑定器,代码1-2。

代码1-2

        private static ModelBinderDictionary CreateDefaultBinderDictionary()
{
ModelBinderDictionary dictionary2 = new ModelBinderDictionary();
dictionary2.Add(typeof(HttpPostedFileBase), new HttpPostedFileBaseModelBinder());
dictionary2.Add(typeof(byte[]), new ByteArrayModelBinder());
dictionary2.Add(typeof(Binary), new LinqBinaryModelBinder());
return dictionary2;
}

这里没有其它的意思,就是让大家看一下系统默认提供的几种Model绑定器类型,同样是使用ModelBinderDictionary类型的Add()方法,唯一不同的就是这是在系统启动时就会添加生成好的,而我们自定义的Model绑定器则是后面手动添加的。

切回主题,从图2中我们可以看到在ModelBinderDictionary类型调用GetBinder()方法的时候实际是调用的ModelBinderProviderCollection类型的GetBinder()方法,其实在ModelBinderDictionary类型的内部有着一个ModelBinderProviderCollection类型的字段,再看图2,在实际调用ModelBinderProviderCollection类型的GetBinder()方法的时候其实真正调用的是IModelBinderProvider类型中的GetBinder()方法。

然而在反编译工具中也有反编译不了的,好比ModelBinderProviderCollection类型,我就没看到它实例化的细节,不过没关系在下一篇中会证明出来它的内部细节。

本篇内容就讲解到这,后续的篇幅中会讲解如何使用这些类型来实现生成Model绑定器并且进行Model绑定。

作者:金源

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

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

ASP.NET MVC Model绑定(二)的更多相关文章

  1. ASP.NET MVC Model验证(二)

    ASP.NET MVC Model验证(二) 前言 上篇内容演示了一个简单的Model验证示例,然后在文中提及到Model验证在MVC框架中默认所处的位置在哪?本篇就是来解决这个问题的,并且会描述一下 ...

  2. ASP.NET MVC Model绑定(四)

    ASP.NET MVC Model绑定(四) 前言 前面的篇幅对于Model绑定器IModelBinder以及实现类型.Model绑定器提供程序都作了粗略的讲解,可以把Model绑定器想象成一个大的容 ...

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

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

  4. ModelBinder——ASP.NET MVC Model绑定的核心

    ModelBinder——ASP.NET MVC Model绑定的核心 Model的绑定体现在从当前请求提取相应的数据绑定到目标Action方法的参数.通过前面的介绍我们知道Action方法的参数通过 ...

  5. ASP.NET MVC Model绑定(六)

    ASP.NET MVC Model绑定(六) 前言 前面的篇幅对于IValueProvider的使用做个基础的示例讲解,但是没并没有对 IValueProvider类型的实现做详细的介绍,然而MVC框 ...

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

    ASP.NET MVC Model绑定(五) 前言 前面的篇幅对于IValueProvider的获取位置和所处的生成过程做了讲解,本篇将会对IValueProvider的使用做个基础的示例讲解,读完本 ...

  7. ASP.NET MVC Model绑定(三)

    ASP.NET MVC Model绑定(三) 前言 看过前两篇的朋友想必对Model绑定有个大概的了解,然而MVC框架给我们提供了更高的可扩展性的提供程序编程模式,也就是本篇的主题了,会讲解一下Mod ...

  8. ASP.NET MVC Model绑定(一)

    ASP.NET MVC Model绑定(一) 前言 ModelMetadata系列的结束了,从本篇开始就进入Model绑定部分了,这个系列阅读过后你会对Model绑定有个比较清楚的了解, 本篇对于Mo ...

  9. ASP.NET MVC Model绑定

    ASP.NET MVC Model绑定(一) 前言 ModelMetadata系列的结束了,从本篇开始就进入Model绑定部分了,这个系列阅读过后你会对Model绑定有个比较清楚的了解, 本篇对于Mo ...

随机推荐

  1. 深入浅出Redis-redis底层数据结构(上)

    1.概述 相信使用过Redis 的各位同学都很清楚,Redis 是一个基于键值对(key-value)的分布式存储系统,与Memcached类似,却优于Memcached的一个高性能的key-valu ...

  2. SQL Server-聚焦UNIOL ALL/UNION查询(二十三)

    前言 本节我们来看看有关查询中UNION和UNION ALL的问题,简短的内容,深入的理解,Always to review the basics. 初探UNION和UNION ALL 首先我们过一遍 ...

  3. jquery.Callbacks的实现

    前言 本人是一个热爱前端的菜鸟,一直喜欢学习js原生,对于jq这种js库,比较喜欢理解他的实现,虽然自己能力有限,水平很低,但是勉勉强强也算是能够懂一点吧,对于jq源码解读系列,博客园里有很多,推荐大 ...

  4. kafka源码分析之一server启动分析

    0. 关键概念 关键概念 Concepts Function Topic 用于划分Message的逻辑概念,一个Topic可以分布在多个Broker上. Partition 是Kafka中横向扩展和一 ...

  5. zookeeper源码分析之五服务端(集群leader)处理请求流程

    leader的实现类为LeaderZooKeeperServer,它间接继承自标准ZookeeperServer.它规定了请求到达leader时需要经历的路径: PrepRequestProcesso ...

  6. 快递Api接口 & 微信公众号开发流程

    之前的文章,已经分析过快递Api接口可能被使用的需求及场景:今天呢,简单给大家介绍一下微信公众号中怎么来使用快递Api接口,来完成我们的需求和业务场景. 开发语言:Nodejs,其中用到了Neo4j图 ...

  7. AutoMapper的介绍与使用(一)

    软件环境 vs2015 asp.net mvc 5 .NET Framework 4.5.2 AutoMapper 5.2.0.0 AutoMapper安装 新建asp.net mvc 项目 Auto ...

  8. Java实现Excel中的NORMSDIST函数和NORMSINV函数

    由于工作中需要将Excel中的此两种函数转换成java函数,从而计算内部评级的资本占用率和资本占用金额.经过多方查阅资料和整理,总结出如下两个转换方法 标准正态分布累计函数NORMSDIST: pub ...

  9. 企业shell面试题:获取51CTO博客列表倒序排序考试题

    #!/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin HTMLFILE=/home/oldboy/ht ...

  10. windows charles response 乱码解决办法

    使用windows 版本的charles来做代理,发现服务端返回的response会出现中文乱码的情况, 查看软件设置,遗憾的是并没有关于编码的选项. 好在charles windows版本安装目录下 ...