MVC值提供组件ValueProvider的继承关系
MVC请求过程中中各组件调用顺序:值提供组件(IValueProvider)-》模型绑定组件(IModelBinder)-》模型验证组件
值提供组件接口
- public interface IEnumerableValueProvider : IValueProvider
- {
- IDictionary<string, string> GetKeysFromPrefix(string prefix);
- }
- public interface IUnvalidatedValueProvider : IValueProvider
- {
- ValueProviderResult GetValue(string key, bool skipValidation);
- }
ASP.NET MVC 包括值提供程序的实现,这些实现涵盖了大多数常见请求值源,例如查询字符串参数、表单字段和路由数据。
在运行时,ASP.NET MVC 使用 ValueProviderFactories(静态类,包含一个工厂集合) 类中注册的值提供程序计算模型绑定程序可以使用的请求值。
- public static class ValueProviderFactories
- {
- public static ValueProviderFactoryCollection Factories { get; }
- }
默认情况下,值提供程序集合按下面的顺序计算来自各种源的值:
- 以前绑定的操作参数(当该操作为子操作时)
- 表单字段 (Request.Form)
- JSON 请求主体中的属性值 (Request.InputStream),但仅当该请求为 AJAX 请求时
- 路由数据 (RouteData.Values)
- 查询字符串参数 (Request.QueryString)
- 已发布文件 (Request.Files)
值提供程序集合如同 Request 对象一样,实际上只不过是一个所谓的字典,即模型绑定程序可以使用且无需知道数据来源的键/值对的抽象层。 然而同 Request 字典相比,值提供程序框架进一步实现了这种抽象,它允许你完全控制模型绑定框架获取其数据的方式及位置。
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对象。
次序(优先级)为:ChildActionValueProviderFactory、FormValueProviderFactory、JsonValueProviderFactory、RouteDataValueProviderFactory、QueryStringValueProviderFactory和HttpFileCollectionValueProviderFactory
值提供组件的继承关系
1,NameValueCollectionValueProvider类(public class NameValueCollectionValueProvider : IUnvalidatedValueProvider, IEnumerableValueProvider, IValueProvider)
NameValueCollectionValueProvider具有两个继承者,即FormValueProvider和QueryStringValueProvider
- public sealed class FormValueProvider : NameValueCollectionValueProvider{}
- public sealed class QueryStringValueProvider: NameValueCollectionValueProvider{}
2,DictionnaryValueProvider/DictionaryValueProvider<TValue>类(public class DictionaryValueProvider<TValue> : IEnumerableValueProvider, IValueProvider)
NameValueCollection和Dictionnary都是一个键值对的集合,它们之间的不同之处在NameValueCollection运行元素具有相同的Key,Dictionnary却要求元素的Key具有唯一性!
DictionaryValueProvider<TValue>具有三个继承者,RouteDataValueProvider、HttpFileCollectionValueProvider、ChildActionValueProvider
- public sealed class RouteDataValueProvider : DictionaryValueProvider<object>{}
- public sealed class HttpFileCollectionValueProvider : DictionaryValueProvider<HttpPostedFileBase[]>{}
- public sealed class ChildActionValueProvider : DictionaryValueProvider<object>{}
3,ValueProviderCollection类
类型ValueProviderCollection不仅仅表示一个ValueProvider对象的集合,还作为一个单纯的ValueProvider来使用
- public class ValueProviderCollection : Collection<IValueProvider>, IUnvalidatedValueProvider, IEnumerableValueProvider, IValueProvider{}
4,通过FormCollection类读取表单数据
- //.net
- public sealed class FormCollection : NameValueCollection,
- IValueProvider{}
- //使用方式,控制器内
- public ActionResult FormCollection(FormCollection formCollection)
- {
- string name=formCollection["name"];
- }
- public ActionResult FormCollection(FormCollection formCollection)
- {
- if (ModelState.IsValid)
- {
- var user = new User();
- //利用控制器的TryUpdateModel方法,进行转换
- TryUpdateModel<User>(user, formCollection);
- }
- }
FormCollection和Requert.Form都是NameValueCollection,他们之间有什么区别?
FormCllection是Request.Form的包装,其在内部实现了IModelBinder(private sealed class FormCollectionModelBinder),接口实现包装了(controllerContext.HttpContext.Request.Form和controllerContext.HttpContext.Request.Unvalidated.Form)
获取的值都是String类型,但是FormCllection是专门为MVC服务的。
1,Request类来自System.Web程序集,不方便测试,而且可移植性差,最新的.net core跨平台移除了对此程序集的依赖
2,Request.Form是只读集合,FormCollection则可以进行修改,
3,FormCollection实现了IValueProvider,可以利用MVC的机制,通过调用Controller.UpdateModel(TModel,FormCollection)进行手动模型更新。
参考:http://www.cnblogs.com/artech/archive/2012/05/17/value-provider-01.html
MVC值提供组件ValueProvider的继承关系的更多相关文章
- Java awt组件间的继承关系
Container的继承关系: Window是可独立存在的容器,其他则不行.
- ValueProvider核心的值提供系统
Model绑定的数据具有多种来源: 提交的表单 Json字符串 当前路由数据 请求地址的查询字符串 ASP.NET MVC将这种基于不同数据来源的数据提供机制实现在ValueProvider的组件中 ...
- MVC框架中的值提供机制(二)
在MVC框架中存在一些默认的值提供程序模板,这些值提供程序都是通过工厂模式类创建;在MVC框架中存在需要已Factory结尾的工厂类,在值提供程序中也存在ValueProviderFactories工 ...
- drf:restful概念,类继承关系,drf请求封装,drf请求流程,版本控制组件,认证组件(token),权限组件
1.restful规范 resfful规范的概念最重要: 是一套规范,规则,用于程序之间进行数据交换的约定. 他规定了一些协议,对我们感受最直接的就是,以前写增删改查的时候需要些四个视图寒素,rest ...
- MVC框架中的值提供机制(三)
在MVC框架中NameValueCollectionValueProvider采用一个NameValueCollection作为数据源,DictionnaryValueProvider的数据源类型自然 ...
- MVC框架中的值提供机制(一)
在MVC框架中action方法中的Model数据的绑定的来源有很多个,可能是http请求中的get参数或是post提交的表单数据,会是json字符串或是路径中的相关数据;MVC框架中针对这些不同的数据 ...
- mvc action 参数绑定——值提供器【学习笔记】
每次http请求的各种数据(表单数据.url的数据.路由数据等等)都保存在不同的IValueProvider接口的实现类中. 而IValueProvider接口的实现类是通过ValueProvider ...
- 扯谈spring mvc之WebApplicationContext的继承关系
spring mvc里的root/child WebApplicationContext的继承关系 在传统的spring mvc程序里会有两个WebApplicationContext,一个是pare ...
- QObject提供了QMetaObject元类信息(相当于RTTI和反射),信号与连接,父子关系,调试信息,属性,事件,继承关系,窗口类型,线程属性,时间器,对象名称,国际化
元类信息(相当于RTTI和反射),信号与连接,父子关系,调试信息,属性,事件,继承关系,窗口类型,线程属性,时间器,对象名称,国际化其中元类又提供了:classInfo,className,构造函数, ...
随机推荐
- 【Swift】- UITextField完成输入后关闭软键盘的几种方法
总结了以下几种方式,欢迎补充 1,为空白区域绑定Touch Up Inside事件 2,重写touchesEnded方法 3,为TextField绑定Did End On Exit事件 1,点击 ...
- Ubuntu15.10下Hadoop2.6.0伪分布式环境安装配置及Hadoop Streaming的体验
Ubuntu用的是Ubuntu15.10Beta2版本,正式的版本好像要到这个月的22号才发布.参考的资料主要是http://www.powerxing.com/install-hadoop-clus ...
- Backit轻松为您的网站创建备份
随着日益复杂,备份数据,已成为一个经验法则,为维护数据库和重要的企业信息化的大公司和企业.在一个不幸的灾难的情况下,很多企业无法恢复他们的数据,这进一步增加了在他们对所有盈利和亏损的同时,作为他们的电 ...
- 把OnDraw和OnPaint弄清楚(转贴)
OnDraw()和OnPaint()兄弟 经常有朋友问雷神这样的问题:我在视图画的图象或者文字,当窗口改变后为什么不见了?OnDraw()和OnPaint()两个都是解决上面的问题,有什么不同? 雷神 ...
- java调用python
本文记录下使用jython包来实现java代码中调用Python. 一.Maven加入 <dependency> <groupId>org.python</groupId ...
- 32位机,CPU是如何利用段寄存器寻址的
转自:http://blog.sina.com.cn/s/blog_640531380100xa15.html 32位cpu 地址线扩展成了32位,这和数据线的宽度是一致的.因此,在32位机里其实并不 ...
- hibernate缓存机制详细介绍
hibernate的缓存机制,包括一级缓存(session级别).二级缓存(sessionFactory级别). 一:hibernate的 N+1问题 list()获得对象: 如果通过list()方法 ...
- python's twenty-seventh day for me 模
time模块: 1,计算执行代码的时间 time.time() 2,让程序停这里一段时间 time.sleep(时间(s)) 时间戳时间: import time print(time.time()) ...
- Node.js实用知识点
本文介绍如何使用nodejs 简单的HttpServer 调试nodejs 基础路由 nodejs配置开发和生产环境 nodejs核心模块一览 express用法 文件I/O nodejs模块 nod ...
- Three.js会飞走飞回来的鸟
效果图 demo import './index.css'; // stats var stats; (function(){ stats = new Stats(); document.body.a ...