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. SQLSERVER聚集索引与非聚集索引的再次研究(上)

    SQLSERVER聚集索引与非聚集索引的再次研究(上) 上篇主要说聚集索引 下篇的地址:SQLSERVER聚集索引与非聚集索引的再次研究(下) 由于本人还是SQLSERVER菜鸟一枚,加上一些实验的逻 ...

  2. ASP.NET MVC5+EF6+EasyUI 后台管理系统 (源码购买说明)

    系列目录 升级日志 !!!重大版本更新:于2016-12-20日完成了系统的结构重构并合并简化了T4(这是一次重要的更新,不需要修改现有功能的代码),代码总行数比上个版本又少了1/3.更新了代码生成器 ...

  3. so 问题来了,你现在值多少钱?

    年底了一大帮人都写着年底总结,总结一年做过的事.错过的事和做错的事.增长了多少本事,找没找到女朋友……来年做好升职加薪,要么做跳槽的准备,程序猿又开始浮躁了……. so 问题来了,你现在值多少钱? 这 ...

  4. spring boot 部署为jar

    前言 一直在ide中敲代码,使用命令行mvn spring-boot:run或者gradlew bootRun来运行spring boot项目.想来放到prod上面也应该很简单.然而今天试了下,各种问 ...

  5. Angular2 Hello World 之 RC6

    angular2还没有发布正式版,确实有点不靠谱,变化太频繁,之前写的demo直接将js升级到最新版之后发现就不能用了……所以现在在写一篇demo——基于RC6.参考:http://web3.code ...

  6. Android 调用百度地图API

    一.到 百度地图开发平台下载SDK http://lbsyun.baidu.com/index.php?title=androidsdk/sdkandev-download 1.点击自定义下载 2.下 ...

  7. 【转】组件化的Web王国

    本文由 埃姆杰 翻译.未经许可,禁止转载!英文出处:Future Insights. 内容提要 使用许多独立组件构建应用程序的想法并不新鲜.Web Component的出现,是重新回顾基于组件的应用程 ...

  8. OpenSUSE下编译安装OpenFoam

    在不是Ubuntu系统下安装OpenFoam,需要采用编译安装的方式.以下以OpenSuSE为例进行编译安装. 1 软件包准备 需要下载两个程序包: OpenFOAM-4.x-version-4.1. ...

  9. Outfit7 庆祝其开发工作大获丰收

    走不寻常路之经验总结 每位合格应用开发人员都拥有相同的目标:灵机一动,构建独创性原型,克服各种困难,最终吸引投资者将其想法推向市场. 名声.财富以及构建更多应用的机会将接踵而至. 焦虑.改善和重复是开 ...

  10. 2DToolkit官方文档中文版打地鼠教程(二):设置摄像机

    这是2DToolkit官方文档中 Whack a Mole 打地鼠教程的译文,为了减少文中过多重复操作的翻译,以及一些无必要的句子,这里我假设你有Unity的基础知识(例如了解如何新建Sprite等) ...