ValueProvider核心的值提供系统
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核心的值提供系统的更多相关文章
- MVC值提供组件ValueProvider的继承关系
MVC请求过程中中各组件调用顺序:值提供组件(IValueProvider)->模型绑定组件(IModelBinder)->模型验证组件 值提供组件接口 public interface ...
- ASP.NET MVC5学习笔记之Action参数模型绑定值提供体系
这一节我们关注模型绑定的值提供体系,先来介绍几个重要的接口 一. IValueProvider,接口定义如下: public interface IValueProvider { bool Conta ...
- 值提供器 AND 模型绑定器
本章介绍了值提供器的作用,ASP MVC自带的5中值提供器.以及模型绑定器的作用,自定义模型绑定器并使用自定义的模型绑定器(类型上加上[ModelBinder(typeof(xx))]或者在全局模型绑 ...
- MVC3.0学习笔记之元模型元数据ModelMetaData以及模型元数据提供系统
模型元数据ModelMetaData是MVC中很重要的概念,它包括但不仅限于 模型的类型,模型包含了哪些属性,属性都是什么类型的,属性上都有什么特性. ASP.NET MVC3.0 提供了默认的模型元 ...
- mvc action 参数绑定——值提供器【学习笔记】
每次http请求的各种数据(表单数据.url的数据.路由数据等等)都保存在不同的IValueProvider接口的实现类中. 而IValueProvider接口的实现类是通过ValueProvider ...
- MVC框架中的值提供机制(二)
在MVC框架中存在一些默认的值提供程序模板,这些值提供程序都是通过工厂模式类创建;在MVC框架中存在需要已Factory结尾的工厂类,在值提供程序中也存在ValueProviderFactories工 ...
- MVC框架中的值提供机制(三)
在MVC框架中NameValueCollectionValueProvider采用一个NameValueCollection作为数据源,DictionnaryValueProvider的数据源类型自然 ...
- MVC框架中的值提供机制(一)
在MVC框架中action方法中的Model数据的绑定的来源有很多个,可能是http请求中的get参数或是post提交的表单数据,会是json字符串或是路径中的相关数据;MVC框架中针对这些不同的数据 ...
- 通过TTL值判断系统
我们做网络的渗透测试,开始的时候会ping一下网站判断一下网站使用的系统,默认情况下, UNIX 255 LINUX 64WIN2K/NT 128WINDOWS 32 但是 每经过一个路由器就会减1这 ...
随机推荐
- 使用序列号激活优动漫PAINT(附激活码)
优动漫PAINT是一款功能强大的动漫绘图软件,简单的中文界面和丰富的笔刷操纵,再次为设计工作者带来非一般的感受!最近,有不少小伙伴提出这样的疑问:购买安装优动漫PAINT之后,不知道如何激活,在哪里输 ...
- Windows下的chcp命令(更改该控制台的活动控制台代码页)
Chcp 显示活动控制台代码页数量,或更改该控制台的活动控制台代码页.如果在没有参数的情况下使用,则 chcp 显示活动控制台代码页的数量. 语法 chcp [nnn] 参数 指定代码页.下表列出了所 ...
- vc++实例创建简单窗体
#include<windows.h>#include<stdio.h>LRESULT CALLBACK WinSunProc(HWND hwnd,UINT uMsg,WPAR ...
- 如何使用Matlab做数字信号处理的仿真1
例如 第三版数字信号处理P51 -1.14习题时域离散信号的相关性研究x(n)=Asin(ωn)+u(n),其中ω=π/16,u(n)是白噪声,现要求 ⑴.产生均值为0,功率P=0.1的均匀分布白噪声 ...
- Javase 集合1
package Swxx; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; pu ...
- MaterialDesign动画
一.概述 MaterialDesign设计理念 MaterialDesign动画 二.实例讲解 (1)Touch Feedback (2)Reveal Effect (3)Activity Trans ...
- 【BZOJ3451】Tyvj1953 Normal - 点分治+FFT
题目来源:NOI2019模拟测试赛(七) 非原题面,题意有略微区别 题意: 吐槽: 心态崩了. 好不容易场上想出一题正解,写了三个小时结果写了个假的点分治,卡成$O(n^2)$ 我退役吧. 题解: 原 ...
- HDU 1385 Minimum Transport Cost( Floyd + 记录路径 )
链接:传送门 题意:有 n 个城市,从城市 i 到城市 j 需要话费 Aij ,当穿越城市 i 的时候还需要话费额外的 Bi ( 起点终点两个城市不算穿越 ),给出 n × n 大小的城市关系图,-1 ...
- P1423 小玉在游泳
... 题目描述 小玉开心的在游泳,可是她很快难过的发现,自己的力气不够,游泳好累哦.已知小玉第一步能游2米,可是随着越来越累,力气越来越小,她接下来的每一步都只能游出上一步距离的98%.现在小玉想知 ...
- BZOJ 4712 洪水 (线段树+树剖动态维护DP)
题目大意:略 题目传送门 数据结构好题,但据说直接上动态DP会容易处理不少,然而蒟蒻不会.一氧化碳大爷说还有一个$log$的做法,然而我只会$log^{2}$的.. 考虑静态时如何处理,设$f[x]$ ...