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这 ...
随机推荐
- vue-留言板-bootstrap
最近看完入门API,看完视频自己写了个留言板,因为主要是学习vue,所以就复习了一下bootstrap,布局更简单,先看看样式吧. 简单清晰的布局,先说一下功能, 1.输入用户名密码点击提交放入表格 ...
- apache出现You don't have permission to access / on this server提示的解决方法
在apache的配置文件httpd.conf里定义了对网站根默认的访问权限 #<Directory /> Options FollowSymLinks AllowOverrid ...
- 重载(overload)和重写(override)的对比(笔试经常出)
Day04_SHJavaTraing_4-6-2017 1.重载(overload): ①权限修饰符(public private 默认): 无关 ②返回值类型: ...
- 数据的图表统计highcharts
数据统计常用的图表一般是饼状图.柱状图.线状图,HighCharts可以很好的实现. HighCharts highcharts是基于jquery的一个功能强大的插件,使用时先导入jquery.js ...
- Jquery 研究 入口
<script type="text/javascript"> //var jQuery = function () { // console.log(jQuery.f ...
- MindManager 2019新版上市 ,了解一下!
所有的等待都是值得的!MindManager在蓄力一年后,给各位思维导图爱好者带来了全新的MindManager 2019 for Windows.全新的版本包含英语.德语.法语.俄语.中文.日语,新 ...
- 如何激活优动漫PAINT,获取优动漫PAINT序列号
优动漫PAINT也就是我们常说的clip studio paint(CSP)的中文版本,它是一款功能强大的漫画.插画绘制软件,所有动漫和漫画插件使用帮助你更加便捷的创作有质量的二次元素材,是各位喜欢动 ...
- idea中SVN的运用
1.1.1 上传代码时可以指定忽略一些上传目录 1.1.2 设置项目上传的路径 1.1.3 解决上传路径中包含“svn”目录问题 上传 从 SVN 服务器中检出代码到工作空间
- PHP 时间处理
1:获取当前日期格式时间 date("Y-m-d H:i:s"); 2:转化为时间戳 strtotime( date("Y-m-d") ) 3:转化为日期 ...
- openlayers5学习笔记-001
tmp.initPoint = function (items) { //初始化所有农户点坐标,聚合 var count = items.length; var features = new Arra ...