欢迎访问 生活随笔!

尊龙游戏旗舰厅官网

当前位置: 尊龙游戏旗舰厅官网 > 编程语言 > asp.net >内容正文

asp.net

asp.net mvc model绑定(四) -尊龙游戏旗舰厅官网

发布时间:2025/1/21 asp.net 18 豆豆
尊龙游戏旗舰厅官网 收集整理的这篇文章主要介绍了 asp.net mvc model绑定(四) 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

前言

前面的篇幅对于model绑定器imodelbinder以及实现类型、model绑定器提供程序都作了粗略的讲解,可以把model绑定器想象成一个大的容器,为什么这么说呢?留个疑问在这里。

首先控制器的方法参数可能是很多种类型的、可能是多个同一种类型的,应对这种情况mvc框架使用的绑定实现都是ivalueprovider来做的,而针对参数类型的不同等等一些情况,ivalueprovider的实现类型也是有很大的差异的,这些具体实现的讲解会在后续的篇幅中讲解。

都说旁观者清,我们不要走进mvc框架,站在外面看。本篇会已站在外面的角度去对ivalueprovider做个描述。

 

model绑定

  • imodelbinder、自定义model绑定器简单实现
  • model绑定器在mvc框架中的位置
  • mvc中的默认model绑定器生成过程
  • imodelbinderprovider的简单应用
  • ivalueprovider在mvc框架中生成的位置以及过程
  • ivalueprovider的应用场景
  • ivalueprovider的实现之namevaluecollectionvalueprovider

 

ivalueprovider在mvc框架中生成的位置以及过程

生成的位置

大家可否记得在asp.net mvc model绑定(二)中对于model绑定器生成位置的描述,这里借用一下那副描述生成位置的示意图,

图1

图1中所示,蓝色线条执行流程中,在model绑定器生成后,即会生成ivalueprovider类型,说是生成有点不妥,改成获取吧。为什么这样说在下面的生成部分会讲到

 

生成的过程

我们先看一下图1中蓝色线条流程的实现代码。

代码1-1

protected virtual object getparametervalue(controllercontext controllercontext, parameterdescriptor parameterdescriptor){type parametertype = parameterdescriptor.parametertype;imodelbinder modelbinder = this.getmodelbinder(parameterdescriptor);ivalueprovider valueprovider = controllercontext.controller.valueprovider;string str = parameterdescriptor.bindinginfo.prefix ?? parameterdescriptor.parametername;predicate<string> propertyfilter = getpropertyfilter(parameterdescriptor);modelbindingcontext context2 = new modelbindingcontext{fallbacktoemptyprefix = parameterdescriptor.bindinginfo.prefix == null,modelmetadata = modelmetadataproviders.current.getmetadatafortype(null, parametertype),modelname = str,modelstate = controllercontext.controller.viewdata.modelstate,propertyfilter = propertyfilter,valueprovider = valueprovider};modelbindingcontext bindingcontext = context2;return (modelbinder.bindmodel(controllercontext, bindingcontext) ?? parameterdescriptor.defaultvalue);}

对于代码1-1中所示的方法,不用去管的它的返回类型以及这个方法的作用,我们现在想知道的就是ivalueprovider是怎么来的!!!

从代码1-1中,我们可以明确的看到在生成model绑定器过后,mvc框架从controllercontext控制器上下文参数对象中获得了当前请求所请求的控制器的引用,然后根据当前的控制器对象引用获取到ivalueprovider类型。

然后mvc框架会实例化modelbindingcontext类型,并且把刚刚获取的ivalueprovider类型赋值到其中的valueprovider属性上。

对于modelbindingcontext类型,model绑定上下文对象,看下它的定义代码1-2。

代码1-2

public class modelbindingcontext{public modelbindingcontext();public modelbindingcontext(modelbindingcontext bindingcontext);public bool fallbacktoemptyprefix { get; set; }public object model { get; set; }public modelmetadata modelmetadata { get; set; }public string modelname { get; set; }public modelstatedictionary modelstate { get; set; }public type modeltype { get; set; }public predicate<string> propertyfilter { get; set; }public idictionary<string, modelmetadata> propertymetadata { get; }//// 摘要:// 获取或设置值提供程序。//// 返回结果:// 值提供程序。public ivalueprovider valueprovider { get; set; }}

这里我们只需初步的了解modelbindingcontext类型就行了,回到主题中,上面说到从当前控制器对象的引用中直接获取的,那我们就去看一下控制器中的valueprovider属性。我们就来看一下controller类型,代码1-3.

代码1-3

public abstract class controller : controllerbase, iactionfilter, iauthorizationfilter, idisposable, iexceptionfilter, iresultfilter {…… }

跟大家开了个玩笑,缓解下气氛。controller类型中并没有我们所要找的属性,有的朋友想到了,对的是在基类类型中的,确实是在controllerbase类型中的(代码1-4)。

代码1-4

public abstract class controllerbase : icontroller {……public ivalueprovider valueprovider { get; set; } }

难道我们在使用ivalueprovider的时候是要赋值到控制器对象上的吗?

当然不是了,我们看一下代码1-4中valueprovider属性的实现,示例代码1-5.

代码1-5

public ivalueprovider valueprovider{get{if (this._valueprovider == null){this._valueprovider = valueproviderfactories.factories.getvalueprovider(this.controllercontext);}return this._valueprovider;}set{this._valueprovider = value;}}

看到这里想必大家就应该已经了解了ivalueprovider类型的由来了,是从系统的valueproviderfactories类型的factories属性中来根据当前控制器上下文获取到的。

这里我们看一下生成ivalueprovider类型的几个相关类型的定义,示例代码1-6。

代码1-6

public static class valueproviderfactories{// 摘要:// 获取应用程序的值提供程序工厂的集合。//// 返回结果:// 值提供程序工厂对象的集合。public static valueproviderfactorycollection factories { get; }}
public class valueproviderfactorycollection : collection{public valueproviderfactorycollection();public valueproviderfactorycollection(ilist list);// 摘要:// 为指定控制器上下文返回值提供程序工厂。//// 参数:// controllercontext:// 一个对象,该对象封装有关当前 http 请求的信息。//// 返回结果:// 用于指定控制器上下文的值提供程序工厂对象。public ivalueprovider getvalueprovider(controllercontext controllercontext);protected override void insertitem(int index, valueproviderfactory item);protected override void setitem(int index, valueproviderfactory item);} public abstract class valueproviderfactory{protected valueproviderfactory();// 摘要:// 为指定控制器上下文返回值提供程序对象。//// 参数:// controllercontext:// 一个对象,该对象封装有关当前 http 请求的信息。//// 返回结果:// 值提供程序对象。public abstract ivalueprovider getvalueprovider(controllercontext controllercontext);}

valueproviderfactories类型的这种模式前面见过太多了,就不说了,它里面包含着valueproviderfactorycollection类型的静态属性,而valueproviderfactorycollection类型又是valueproviderfactory类型的集合类型,所以在最终生成ivalueprovider类型的时候也是先遍历valueproviderfactorycollection类型,获取每个valueproviderfactory类型的实例并且来生成ivalueprovider类型,这里也是最先匹配而不是最优匹配。

这里捎带一句,可以用控制器上下文对象来对valueproviderfactory类型中的生成逻辑进行分类,针对不同的控制器生成不同的ivalueprovider类型。对于ivalueprovider类型的使用后面篇幅会有说明。

 

 

作者:金源

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

本文尊龙游戏旗舰厅官网的版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面

转载于:https://www.cnblogs.com/jin-yuan/p/3819206.html

总结

以上是尊龙游戏旗舰厅官网为你收集整理的asp.net mvc model绑定(四)的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得尊龙游戏旗舰厅官网网站内容还不错,欢迎将尊龙游戏旗舰厅官网推荐给好友。

网站地图