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

  1. protected internal ModelBinderDictionary Binders
  2. {
  3. get
  4. {
  5. if (this._binders == null)
  6. {
  7. this._binders = ModelBinders.Binders;
  8. }
  9. return this._binders;
  10. }
  11. set
  12. {
  13. this._binders = value;
  14. }
  15. }

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

代码1-2

  1. private static ModelBinderDictionary CreateDefaultBinderDictionary()
  2. {
  3. ModelBinderDictionary dictionary2 = new ModelBinderDictionary();
  4. dictionary2.Add(typeof(HttpPostedFileBase), new HttpPostedFileBaseModelBinder());
  5. dictionary2.Add(typeof(byte[]), new ByteArrayModelBinder());
  6. dictionary2.Add(typeof(Binary), new LinqBinaryModelBinder());
  7. return dictionary2;
  8. }

这里没有其它的意思,就是让大家看一下系统默认提供的几种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. 用CIL写程序:你好,沃尔德

    前言: 项目紧赶慢赶总算在年前有了一些成绩,所以沉寂了几周之后,小匹夫也终于有时间写点东西了.以前匹夫写过一篇文章,对CIL做了一个简单地介绍,不过不知道各位看官看的是否过瘾,至少小匹夫觉得很不过瘾. ...

  2. HTML 事件(三) 事件流与事件委托

    本篇主要介绍HTML DOM中的事件流和事件委托. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流与事件委托 4 ...

  3. OpenSceneGraph in ActiveX by ActiveQt

    OpenSceneGraph in ActiveX by ActiveQt eryar@163.com Abstract. Qt’s ActiveX and COM support allows Qt ...

  4. AES加密

    package com.edu.hpu; import java.math.BigInteger; import java.security.MessageDigest; import java.se ...

  5. ASP.NET MVC5+EF6+EasyUI 后台管理系统(65)-MVC WebApi 用户验证 (1)

    系列目录 前言: WebAPI主要开放数据给手机APP,其他需要得知数据的系统,或者软件应用,所以移动端与系统的数据源往往是相通的. Web 用户的身份验证,及页面操作权限验证是B/S系统的基础功能, ...

  6. const extern static 终极指南

    const extern static 终极指南 不管是从事哪种语言的开发工作,const extern static 这三个关键字的用法和原理都是我们必须明白的.本文将对此做出非常详细的讲解. co ...

  7. .NET CoreCLR开发人员指南(上)

    1.为什么每一个CLR开发人员都需要读这篇文章 和所有的其他的大型代码库相比,CLR代码库有很多而且比较成熟的代码调试工具去检测BUG.对于程序员来说,理解这些规则和习惯写法非常的重要. 这篇文章让所 ...

  8. C#调用C++代码遇到的问题总结

    最近在开发服务后台的时候,使用c#调用了多个c++编写的dll,期间遇到了一系列的问题,经过一番努力最后都一一解决了,在此做个总结,方便以后参考,毕竟这些问题也都是很常见的,主要有以下问题: 类型对照 ...

  9. .NET面试题集锦①(Part一)

    一.前言部分 文中的问题及答案多收集整理自网络,不保证100%准确,还望斟酌采纳. 1.面向对象的思想主要包括什么? 答:任何事物都可以理解为对象,其主要特征: 继承.封装.多态.特点:代码好维护,安 ...

  10. JavaScript学习笔记(四)——jQuery插件开发与发布

    jQuery插件就是以jQuery库为基础衍生出来的库,jQuery插件的好处是封装功能,提高了代码的复用性,加快了开发速度,现在网络上开源的jQuery插件非常多,随着版本的不停迭代越来越稳定好用, ...