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. Scala 大数据 常用算法收集

    一:IP转数字,用于比大小,用在求IP段范围中 def ip2Long(ip: String): Long = { val fragments = ip.split("[.]") ...

  2. Sql Server 优化----SQL语句的执行方式与锁以及阻塞的关系

    阻塞原因之一是不同的Session在访问同一张表的时候因为不兼容锁的原因造成的, 当前执行的SQL语句是否被阻塞(或者死锁),不仅跟当前表上的已有的锁有关,也会跟当前执行的SQL语句的执行方式有关 简 ...

  3. 搭建 Lepus 天兔 监控MySQL

    Part1: Lepus安装需要Lamp环境,lepus官网手册也建议采用XAMPP的方式安装,lepus也是在XAMPP上进行研发的 注意xampp会把apache,mysql,php都安装,所以要 ...

  4. VMware虚拟机共享文件夹问题: /mnt下没有hgfs文件夹

    在使用vmware虚拟机共享文件夹功能的时候,发现在/mnt目录下面没有hgfs文件夹,但是vmware-tool的命令vmhgfs-fuse确实存在于系统中.在使用vmhgfs-fuse建立宿主机到 ...

  5. Python中用绘图库绘制一条蟒蛇

    一..构思设计蟒蛇的长度颜色等 首先,我们来构思一个简单的蟒蛇.让它的颜色为黄色,形状为一条正在爬行的蟒蛇. 二..准备绘图库 Python中有一个绘图库叫turtle我们先引入它. import t ...

  6. 路飞学城Python-Day117

    jango用户登录界面 """ Django settings for cnblog project. Generated by 'django-admin startp ...

  7. 【数据分析学习】Pandas思维导图

    点我查看原版

  8. leetCode 929 独特的电子邮件地址

    题目: 每封电子邮件都由一个本地名称和一个域名组成,以 @ 符号分隔. 例如,在 alice@leetcode.com中, alice 是本地名称,而 leetcode.com 是域名. 除了小写字母 ...

  9. UVA227 - Puzzle(紫书习题3.5)

    #include <algorithm> #include <iostream> #include <cstdlib> #include <cstring&g ...

  10. Python爬虫基础--爬取车模照片

    import urllib from urllib import request, parse from lxml import etree class CarModel: def __init__( ...