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这 ...
随机推荐
- UWP Tiles
1.我们建议安装通知库 NuGet 程序包 详细内容 2.我们建议安装NotificationsVisualizerLibrary 这是 The official NotificationsVisua ...
- js去除html标记
function ff(str) { var dd = str.replace(/<\/?.+?>/g, ""); var dds = dd.replace(/ /g, ...
- mvvm模式和mvc模式 概述总结对比
1.mvc模式简介: MVC的全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,是一种软件设计典范.例如: angular ...
- 洛谷P1654 OSU!_概率与期望
Code: #include<cstdio> #include<algorithm> using namespace std; const int maxn = 1000000 ...
- 路飞学城Python-Day96
51-数据库表关系之一对多 为什么有多表的概念? 一个Book有单表的时候只能查询Book表中的内容,要想查询更多的出版社的信息,需要再将单表的内容不断更新 导致单表会存储大量的重复的信息,浪费了大量 ...
- python海龟的使用
############################螺旋正方形############################### import turtle turtle.left(90)for i ...
- sklearn学习汇总
该博主总结的很好,https://www.cnblogs.com/hellcat/p/7531789.html 1.kaggle给出的导图 2.转化成树图: 3.sklearn工具导图
- tsar采集数据原理
系统模块 cpu 字段含义 user: 表示CPU执行用户进程的时间,通常期望用户空间CPU越高越好. sys: 表示CPU在内核运行时间,系统CPU占用率高,表明系统某部分存在瓶颈.通常值越低越好. ...
- 原生ajax的get和post方法封装
get 方法 function serialize (data) { if (!data) { return ''; } var paris = []; for (var key in data) { ...
- flex笔记 - 基础
flex笔记 - 基础 文章中的所有图示代码都放在了github上: 阮一峰flex博客跟学代码 传统的布局解决方案,基于盒模型, 依赖 display, position, float属性来进行布局 ...