MVC框架中的值提供机制(二)
在MVC框架中存在一些默认的值提供程序模板,这些值提供程序都是通过工厂模式类创建;在MVC框架中存在需要已Factory结尾的工厂类,在值提供程序中也存在ValueProviderFactories工厂类,这个类管理着许多的值提供的工厂;
public static class ValueProviderFactories
{
private static readonly ValueProviderFactoryCollection _factories = new ValueProviderFactoryCollection()
{
new ChildActionValueProviderFactory(),
new FormValueProviderFactory(),
new JsonValueProviderFactory(),
new RouteDataValueProviderFactory(),
new QueryStringValueProviderFactory(),
new HttpFileCollectionValueProviderFactory(),
new JQueryFormValueProviderFactory()
}; public static ValueProviderFactoryCollection Factories
{
get { return _factories; }
}
}
在ControllerBase类中的ValueProvider值默认也是通过ValueProviderFactories类中Factories集合中的值提供工厂创建的;在获取IValueProvider 时是按照_factories 集合中添加的顺序遍历的,也就是说_factories 中的顺序决定了优先采用哪个值提供程序;
ControllerBase.cs
public IValueProvider ValueProvider
{
get
{
if (_valueProvider == null)
{
_valueProvider = ValueProviderFactories.Factories.GetValueProvider(ControllerContext);
}
return _valueProvider;
}
set { _valueProvider = value; }
}
在ValueProviderFactories的ValueProviderFactoryCollection集合中默认添加的几个工厂类
ChildActionValueProviderFactory:获取子action中的值提供程序的工厂;工厂创建ChildActionValueProvider类;ChildActionValueProvider类继承DictionaryValueProvider<object>,处理子Action(子Action是在某个View中被调用生成某个部分的HTML,类似产生Partial View的Action)时提供值,与RouteDataValueProviderd都是以object为类型的value,同样从ControllerContext的Routedata提取值,Routedata的value(实际上是RouteValueDictionary类型)作为ChildActionValueProvider的数据容器字典,ChildActionValueProvider与RouteDataValueProvider的区别在于GetValue方法,RouteDataValueProvider是根据RouteValueDictionary的键值对去匹配,而ChildActionValueProvider是从它本身的字典集中,已一个GUID值作为key对应的value里面去取值,这个GUID是ChildActionValueProvider的一个静态属性,以这个key获取的value,本身是一个字典集,这个字典集的每一对key/value都存在于ChildActionValueProvider本身的键值对容器中,相当于以GUID为key的value作为了一个副本。
FormValueProviderFactory:获取表单提交中的值提供程序的工厂;工厂创建FormValueProvider类;
JsonValueProviderFactory:获取json字符串中的值提供程序的工厂;工厂创建DictionaryValueProvider类;
RouteDataValueProviderFactory:获取路由Data中的值提供程序的工厂;工厂创建RouteDataValueProvider类;
QueryStringValueProviderFactory:获取QueryString集合中的值提供程序的工厂;工厂创建QueryStringValueProvider类;
HttpFileCollectionValueProviderFactory:获取Http文件中的值提供程序的工厂;工厂创建HttpFileCollectionValueProvider类;
JQueryFormValueProviderFactory:获取JQueryForm中的值提供程序的工厂;工厂创建JQueryFormValueProvider类;
这些工厂类都继承了ValueProviderFactory类,这个类是一个抽象类,他的作用提供了一个根据控制器上下文(ControllerContext)来创建各种的ValueProvider,具体的创建的工作则交给他的继承类来实现;
public abstract class ValueProviderFactory
{
public abstract IValueProvider GetValueProvider(ControllerContext controllerContext);
}
在网上找到了一张接口类库之间的关系图,但是这张图上有个错误,QueryStringValueProvider类实际是继承了NameValueCollectionValueProvider类,而不是DictionaryValueProvider类;而ChildActionValueProvider继承了DictionaryValueProvider类而不是NameValueCollectionValueProvider类;
MVC框架中的值提供机制(二)的更多相关文章
- MVC框架中的值提供机制(三)
在MVC框架中NameValueCollectionValueProvider采用一个NameValueCollection作为数据源,DictionnaryValueProvider的数据源类型自然 ...
- MVC框架中的值提供机制(一)
在MVC框架中action方法中的Model数据的绑定的来源有很多个,可能是http请求中的get参数或是post提交的表单数据,会是json字符串或是路径中的相关数据;MVC框架中针对这些不同的数据 ...
- [原]命令模式在MVC框架中的应用
其实在项目开发中,我们使用了大量的设计模式,只是这些设计模式都封装在框架中了,如果你想要不仅仅局限于简单的使用,就应该深入了解框架的设计思路. 在MVC框架中,模式之一就是命令模式,先来看看模式是如何 ...
- 命令模式在MVC框架中的应用
事实上在项目开发中,我们使用了大量的设计模式,不过这些设计模式都封装在框架中了,假设你想要不只局限于简单的使用,就应该深入了解框架的设计思路. 在MVC框架中,模式之中的一个就是命令模式,先来看看模式 ...
- 在ASP.NET MVC 框架中调用 html文件及解析get请求中的参数值
在ASP.NET MVC 框架中调用 html文件: public ActionResult Index() { using (StreamReader sr = new StreamReader(P ...
- MVC 框架中的缓存
在程序中加入缓存的目的很多是为了提高程序的性能,提高数据的查找效率,在MVC框架中也引入了非常多的缓存,比如Controller的匹配查找,Controller,ControllerDescripto ...
- 找到MVC框架中前端URL与后端同步的解决方案
基本思路: 先用URL标签生成完整的URL字符,前端动态参数的部分以适配符先填充,最后动态参数利用正则匹配进行替换. 这种方式,可以在各种MVC框架中适用,妙. 不废话,上码. var url = & ...
- asp.net MVC 框架中控制器里使用Newtonsoft.Json对前端传过来的字符串进行解析
下面我用一个实例来和大家分享一下我的经验,asp.net MVC 框架中控制器里使用Newtonsoft.Json对前端传过来的字符串进行解析. using Newtonsoft.Json; usin ...
- 前端控制器是整个MVC框架中最为核心的一块,它主要用来拦截符合要求的外部请求,并把请求分发到不同的控制器去处理,根据控制器处理后的结果,生成相应的响应发送到客户端。前端控制器既可以使用Filter实现(Struts2采用这种方式),也可以使用Servlet来实现(spring MVC框架)。
本文转自http://www.cnblogs.com/davidwang456/p/4090058.html 感谢作者 前端控制器是整个MVC框架中最为核心的一块,它主要用来拦截符合要求的外部请求,并 ...
随机推荐
- 【我的Android进阶之旅】如何去除ListView中Header View、Footer View中的分割线
最近的项目中给ListView 加入了一个Header View之后,发现Header View的下方也有了分割线,很难看,UI要求将Header View的分割器去掉,好吧.现在就来说一说如何如何去 ...
- 链路的有效性检测 及 基于TCP的通信为什么需要RETRY
一.链路的有效性检测 当网络发生单通.连接被防火墙Hang住.长时间GC或者通信线程发生非预期异常时,会导致链路不可用且不易被及时发现. 特别是异常发生在凌晨业务低谷期间,当早晨业务高峰期到来时,由于 ...
- windows下的Mysql安装与基本使用(zip)
一.安装过程 Mysql社区版下载地址:http://dev.mysql.com/downloads/mysql/ --注意,已管理员身份运行cmd.exe,很重要!!目录在,c:\windows\s ...
- effective C++ 条款25 swap
item 25:一个不抛异常的swap函数 标准库有一个swap用于交换两个对象值 namespace std{ template<typename T> void swap(T& ...
- Apache添加多端口
Apache\conf 目录下 添加端口监听 Vhost.conf简单写写
- 规则引擎drools的简单使用
规则引擎适用于有复杂多变的规则,如商品满减.积分赠送.考勤规则等 一.引入maven依赖 <dependency> <groupId>org.drools</groupI ...
- 113. Path Sum II(求等于某个数的所有路径)
Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given su ...
- Linux网络相关命令firewalld和netfilter、iptables 使用(6/22)
iptables和netfilter的关系: netfilter在内核空间的代码根据table中的rules,完成对packet的分析和处置.但是这些table中的具体的防火墙rules,还是必须由系 ...
- CAS单点登录的原理
1.首先了解几个概念 1).TGC:Ticket-granting cookie,存放用户身份认证凭证的cookie,在浏览器和CAS Server间通讯时使用.2).TGT:ticket grant ...
- Linux 上下左右键变成^A,^B,^C,^D解决方法
用gedit打开 /etc/vim/vimrc.tiny,将里面的 set compatible 改成 set nocompatible 对于退格键backspace的问题,只需在刚才那句话下面加上一 ...