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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        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

1
2
3
4
5
6
7
8
        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绑定。

本文转自jinyuan0829 51CTO博客,原文链接:http://blog.51cto.com/jinyuan/1432203,如需转载请自行联系原作者

ASP.NET MVC Model绑定(二)相关推荐

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

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

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

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

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

    Model的绑定体现在从当前请求提取相应的数据绑定到目标Action方法的参数.通过前面的介绍我们知道Action方法的参数通过ParameterDescriptor来描述,ParameterDesc ...

  4. ASP.NET MVC Model绑定小结

    Model绑定是指从URL提取数据,生成对应Action方法的参数这个过程.前面介绍的一系列Descriptor负责提供了控制器,行为方法和参数的元数据,ValueProvieder负责获取数据,剩下 ...

  5. ASP.NET MVC 控制器激活(二)

    ASP.NET MVC 控制器激活(二) 前言 在之前的篇幅中,用文字和图像来表示了控制器的激活过程,描述的角度都是从框架默认实现的角度去进行描述的,这样也使得大家都可以清楚的知道激活的过程以及其中涉 ...

  6. ASP.NET MVC Model元数据(五)

    ASP.NET MVC Model元数据(五) 前言 在上一篇中我们描述了应用于Model上面的各种用于显示控制的特性类,在本篇中将详细的介绍这些特性类的应用,虽然它们跟Model元数据的直接关系并不 ...

  7. ASP.NET Process Model之二:ASP.NET Http Runtime Pipeline - Part II

    二.ASP.NET Runtime Pipeline(续ASP.NET Http Runtime Pipeline - Part I) 现在我们真正进入ASP.NET管辖的范畴,下图基本上囊括整个处理 ...

  8. ASP.NET MVC XML绑定Action参数列表

    昨天查看了 ASP.NET MVC 的生命周期,并没有找到类似的解决方案. 不过今天在 stackoverflow上找到了解决方案,没耐心的同学可以直接戳原文拷贝代码,原文地址:How to pass ...

  9. ASP.NET MVC模型绑定int超出范围时

    ASP.NET MVC后台在接受int 参数时,如果html页面输入的数值不是介于-2,147,483,648 到 2,147,483,647.那么ASP.NET MVC会自动将其转换成0 转载于:h ...

最新文章

  1. python基础===Number
  2. 这样就能用MathType编辑^符号
  3. python输入若干个整数试找出其中的最大数和最小数_Python编程的若干个经典小技巧...
  4. 新站如何使用标签才对SEO优化更有利
  5. python求平方根的代码_python如何求平方根
  6. shell中的$()、${}、$(())、(())
  7. 腾讯高性能图计算框架Plato及其算法应用
  8. matlab正余弦画心形图案
  9. linux文件编程(1)—— open、write、read、lseek、阻塞问题
  10. python基础技巧总结(四)
  11. aio 系统原理 Java_Java新一代网络编程模型AIO原理及Linux系统AIO介绍
  12. C#: using JsonReader avoid Deserialize Json to dynamic
  13. erlang supervisor中启动普通的进程
  14. cisco ip phone 7911 安装
  15. JMeter下载及安装详细教程
  16. Python|十五个超级炫酷的代码
  17. EasyAR 4.3 Unity云识别
  18. 【NVIDIA】Win10 + CUDA10 + cuDNN 安装教程(转载)
  19. word数学公式快捷键-高效率办公技能get
  20. blender建模制作课堂笔记

热门文章

  1. cookie获取java_java中如何获取cookie
  2. 学习笔记——sklearn监督学习:回归(简单数学知识罗列)
  3. php把时间变成整数,php怎么将字符串转为整数
  4. android收费知乎,知乎 Android 端的一次重设计练习
  5. office是不是python的打开方式_python打开excel文件的2种方法(基于win32com)
  6. inner join和left join还有right join的区别
  7. 系统部署文档_惊喜!Alibaba架构师终于发布“微服务架构与实践”文档
  8. python3 ftplib_ftplib — FTP protocol client
  9. matlab simulink数据导出到变量区
  10. numpy数组的索引和切片