Model绑定的数据具有多种来源:

  •   提交的表单
  •   Json字符串
  •   当前路由数据
  •   请求地址的查询字符串

  ASP.NET MVC将这种基于不同数据来源的数据提供机制实现在ValueProvider的组件中

  ValueProvider采用的数据结构是字典类型

  ValueProvider实现了具有System.Web.Mvc.IValueProvider的接口

 public interface IValueProvider
{
//判断数据源容器中是否有指定前缀的key
bool ContainsPrefix(string prefix);
//根据key找到指定的数据
ValueProviderResult GetValue(string key); }

  GetValue返回的是一个System.Web.Mvc.ValueProviderResult对象,提供的数据包含在该对象中。

 public class ValueProviderResult
{
public ValueProviderResult(object rawValue,string attemptedValue,CultrueInfo culture);
//实现向指定目标类型的转换
public object ConvertTo(Type type);
public virtual object ConvertTo(Type type,CultureInfo culture); //数据值的字符串表示
public string AttemptedValue{get;} public CultrueInfo cultrue{get;}
//原始数据
public object RawValue{get;} }

NameValueCollectionValueProvider

  表示一种Key和Value均为字符串的字典,并且对Key不具有唯一性约束(两个元素可以共享相同的key)

public class NameValueCollectionValueProvider:IUnvalidateValueProvider,IEnumerableValueProvider,IValueProvider

IEnumerableValueProvider主要针对于目标类型为集合的数据提供

IUnvalidateValueProvider,提供了额外的getValue(),使我们可以忽略对数据的验证

针对NameValueCollectionValueProvider的数据提供实现由两个具体的实现类:

 //提交表单
FormValueProvider:NameValueCollectionValueProvider
//请求查询字符串
QueryStringValueProvider:NameValueCollectionValueProvider

DictionaryValueProvider

这是一个真正的字典对象。

它与NameValueCollection不同之处在于:

NameValueCollection中的元素仅限于字符串,并且不对key进行唯一性约束

字典中的key具有唯一性,Value也不仅仅局限于字符串

针对DictionaryValueProvider的数据提供实现由两个具体的实现类:

//通过url路由系统解析请求地址得到的路由数据,可以作为Model绑定的数据来源
RouteDataValueProvider:DictionaryValueProvider<object>
//对上传文件获取的数据
HttpFileCollectionValueProvider:DictionaryValueProvider<HttpPostedFileBase[]>
//
ChildActionValueProvider:DictionaryValueProvider<object>

ValueProviderFactory

ValueProviderFactory是创建ValueProvider的工厂,它继承自如下的抽象类

 public abstract class ValueProviderFactory
{
//根据当前ControllerContext创建相应的ValueProvider对象
public abstract IValueProvider GetValueProvider(ControllerContext controllerContext);
}

在System.Web.Mvc命名空间下ASP.NET MVC定义了一系列具体的ValueProviderFactory类型。

下面的列表列出了定义在Model绑定系统中的6个原生的ValueProviderFactory:

  • ChildActionValueProviderFactory:根据给定的Controller上下文创建一个ChildActionValueProvider对象。
  • FormValueProviderFactory:根据给定的Controller上下文创建一个FormValueProvider对象。
  • JsonValueProviderFactory:将以JSON形式表示的请求数据转换成一个Dictionary<string, object>对象,并最终创建一个DictionaryValueProvider<object>对象。
  • RouteDataValueProviderFactory:根据给定的Controller上下文创建一个RouteDataValueProvider对象。
  • QueryStringValueProviderFactory:根据给定的Controller上下文创建一个QueryStringValueProvider对象。
  • HttpFileCollectionValueProviderFactory:根据给定的Controller上下文创建一个HttpFileCollectionValueProvider对象。

ValueProviderFactory的注册

ValueProviderFactory在ASP.NET MVC应用中的注册通过静态类型ValueProviderFactories实现。如下面的代码片断所示,ValueProviderFactories具有一个静态只读属性Factories返回一个表示ValueProviderFactory集合的ValueProviderFactoryCollection类型。

 : public static class ValueProviderFactories
: {
: public static ValueProviderFactoryCollection Factories { get; }
: }
:
: public class ValueProviderFactoryCollection : Collection<ValueProviderFactory>
: {
: public ValueProviderFactoryCollection();
: public ValueProviderFactoryCollection(IList<ValueProviderFactory> list);
: public IValueProvider GetValueProvider(ControllerContext controllerContext);
: }

ValueProviderFactoryCollection的GetValueProvider方法返回的是一个ValueProviderCollection对象,集合中的每个ValueProvider通过对应的ValueProviderFactory来创建。ValueProviderFactory在ValueProviderFactoryCollection集合中的先后次序决定了创建的ValueProvider在ValueProviderCollection中的次序,而次序决定了使用优先级。

在默认的情况下ValueProviderFactories的Factories属性表示的ValueProviderFactoryCollection包含了上面我们介绍的6种ValueProviderFactory,次序(优先级)为:ChildActionValueProviderFactory、FormValueProviderFactory、JsonValueProviderFactory、RouteDataValueProviderFactory、QueryStringValueProviderFactory和。如果具有相同的名称的请求书去同时存在于请求表单和查询字符串中,前者会被选用。

以ValueProvider为核心的值提供系统中涉及到了三类组件/类型,即用于具体实现数据值提供的ValueProvider,ValueProvider通过ValueProviderFactotry,而ValueProviderFactotry通过ValueProviderFactotries进行注册。图5-4所示的UML体现了三者之间的关系。

ValueProvider核心的值提供系统的更多相关文章

  1. MVC值提供组件ValueProvider的继承关系

    MVC请求过程中中各组件调用顺序:值提供组件(IValueProvider)->模型绑定组件(IModelBinder)->模型验证组件 值提供组件接口 public interface ...

  2. ASP.NET MVC5学习笔记之Action参数模型绑定值提供体系

    这一节我们关注模型绑定的值提供体系,先来介绍几个重要的接口 一. IValueProvider,接口定义如下: public interface IValueProvider { bool Conta ...

  3. 值提供器 AND 模型绑定器

    本章介绍了值提供器的作用,ASP MVC自带的5中值提供器.以及模型绑定器的作用,自定义模型绑定器并使用自定义的模型绑定器(类型上加上[ModelBinder(typeof(xx))]或者在全局模型绑 ...

  4. MVC3.0学习笔记之元模型元数据ModelMetaData以及模型元数据提供系统

    模型元数据ModelMetaData是MVC中很重要的概念,它包括但不仅限于 模型的类型,模型包含了哪些属性,属性都是什么类型的,属性上都有什么特性. ASP.NET MVC3.0 提供了默认的模型元 ...

  5. mvc action 参数绑定——值提供器【学习笔记】

    每次http请求的各种数据(表单数据.url的数据.路由数据等等)都保存在不同的IValueProvider接口的实现类中. 而IValueProvider接口的实现类是通过ValueProvider ...

  6. MVC框架中的值提供机制(二)

    在MVC框架中存在一些默认的值提供程序模板,这些值提供程序都是通过工厂模式类创建;在MVC框架中存在需要已Factory结尾的工厂类,在值提供程序中也存在ValueProviderFactories工 ...

  7. MVC框架中的值提供机制(三)

    在MVC框架中NameValueCollectionValueProvider采用一个NameValueCollection作为数据源,DictionnaryValueProvider的数据源类型自然 ...

  8. MVC框架中的值提供机制(一)

    在MVC框架中action方法中的Model数据的绑定的来源有很多个,可能是http请求中的get参数或是post提交的表单数据,会是json字符串或是路径中的相关数据;MVC框架中针对这些不同的数据 ...

  9. 通过TTL值判断系统

    我们做网络的渗透测试,开始的时候会ping一下网站判断一下网站使用的系统,默认情况下, UNIX 255 LINUX 64WIN2K/NT 128WINDOWS 32 但是 每经过一个路由器就会减1这 ...

随机推荐

  1. readonly and const variable

    共同点:都是常量: 不同点:const的值必须在编译前确定,通常在声明的同时赋值:而readonly可在运行时确定:

  2. Linux 安装MySQL5.7.18

    https://dev.mysql.com/downloads/mysql/Linux-Generic md5sum mysql-5.7.18-linux-glibc2.5-x86_64.tar.gz ...

  3. 基于ACE的TAO开发---一个简单的入门实例-----VS2008(二)

    上一节已经说了如何编译idl文件.现在就用编好的文件来写一个最小的corba小程序的.程序分为服务器程序和客户端程序. 说明下,代码是<基于C++CORBA高级编程>一书中的例子. 1.首 ...

  4. 页面footer在底部

    页脚动态贴在底部需要满足以下两个条件: 当主体的内容高度不超过可视区域高度的时候,页脚贴在页面底部. 当主体的内容高度超过可视区域高度的时候,页脚将按正常布局. 方法一:footer高度固定+绝对定位 ...

  5. 安装oracle执行runInstaller文件时报错:“……/install/.oui:Permission denied”

    一:问题描述 二:出错原因 将windows下未解压的Oracle安装软件上传到了linux服务器,导致有三个文件的执行权限丢失. 三:解决方法 为其赋予相应权限即可. 1: [root@MyPc ~ ...

  6. Vue双向绑定

    vue的双向数据绑定的原理相信大家都十分了解:主要是通过ES5的Object对象的defineProperty属性:重写data的set和get函数来实现的. 该方法允许精确的添加或者修改对象的属性: ...

  7. Python编程:从入门到实践 - matplotlib篇 - Random Walk

    随机漫步 # random_walk.py 随机漫步 from random import choice class RandomWalk(): """一个生成随机漫步数 ...

  8. 公司组织oracle培训的理解

    oracle执行机制 1.客户端发送一条sql给oracle服务器,oracle会看这条sql的执行计划是否存在缓存  如果存在则直接运行,如果不存在执行第二步. 2.如果不存在缓存 则会 进行语法检 ...

  9. yii 表单小部件使用

    首先创建model层 因为要使用表单小部件 所以要加载相应的组件 这里需要的组件有 yii\widgets\ActiveForm 和 yii\helpers\Html 接下来在model定义的clas ...

  10. 用 query 方法 获得xml 节点的值

    DECLARE @result xml SET @result='<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelo ...