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类;
转载于:https://www.cnblogs.com/h20064528/p/5057094.html
MVC框架中的值提供机制(二)相关推荐
- 使用MVC框架中要注意的问题(二):将Model和Controller单独用一个项目设计
这个问题很多朋友都会问到,MVC让分工协作成为了可能.但如果所有代码和页面都在一个项目中的话,那么分工就会受到限制.其实,Model和Controller都可以单独用一个(或者多个)程序单独来做. 1 ...
- thinkph 上花院 生多行mysql_PHP_ThinkPHP3.1基础知识快速入门,在当今众多的MVC框架中,ThinkPH - phpStudy...
ThinkPHP3.1基础知识快速入门 在当今众多的MVC框架中,ThinkPHP是一个快速.简单的基于MVC和面向对象的轻量级PHP开发框架,其遵循Apache2开源协议发布,自从诞生以来一直秉承简 ...
- mvc identity连接mysql_asp.net MVC5,如何使用mysql数据库,使用MVC框架中自带的identity用户验证体系...
问题如题 现在很多时候,即使是.net项目,我们用的数据库也未必时是 SQL Server了. 但很多VS 自带的框架(如MVC .WebAPI等框架)中的示例自带的仍然是默认Sql Server的, ...
- Spring MVC框架中关于限制请求方式
在Spring MVC框架中,@RequestMapping注解的主要作用是配置请求路径,除此以外,还可以配置请求方式,例如: @RequestMapping(value = "/add-n ...
- MVC框架中的前端与后端数据传递及实例
一.MVC框架 MVC代表Model.View.Controller,即模型.视图.控制器.其中: View(视图):就是人机交互界面,可以给用户显示业务逻辑数据,同时也可以 接收用户输入的数据. M ...
- python处理信号机制_Python的Flask框架中的signals信号机制
Flask 提供了信号(Signals)功能,是一种消息分发机制.类似于钩子(Hooks).使用信号功能可以降低程序的耦合,分解复杂的业务模型.例如在更新了产品数据后,可以发送一个信号.当有需要对产品 ...
- php的ddd,在MVC框架中实现DDD – PHP
在mvc中,模型是一个层,它包含所有的域业务逻辑. 在域驱动设计中,业务逻辑可以分为各种构建块. 在域驱动设计域模型中. A domain model is a system of abstracti ...
- 找到MVC框架中前端URL与后端同步的解决方案
基本思路: 先用URL标签生成完整的URL字符,前端动态参数的部分以适配符先填充,最后动态参数利用正则匹配进行替换. 这种方式,可以在各种MVC框架中适用,妙. 不废话,上码. var url = & ...
- Java Web学习总结(30)——Service层在MVC框架中的意义和职责
mvc框架由model,view,controller组成,执行流程一般是:在controller访问model获取数据,通过view渲染页面. mvc模式是web开发中的基础模式,采用的是分层设计, ...
最新文章
- 存储过程由结构表生成表
- 写给工程师的十条精进原则
- 有限状态机HDL模板
- php连接postgresql
- 原创:MS Dynamics AX - XBRL 功能
- 伯努利数与自然数幂和
- 数据库事务及隔离级别
- 教你开发jQuery插件(转)
- 用matlab绘制外部导入数据图像,matlab 外部数据导入方法详解(3)
- Verilog HDL中阻塞语句和非阻塞语句的区别
- 媒体查询-响应式布局-BFC
- Intel超线程技术 Hyper-Threading Technology (5) - 微架构/流水线与超线程技术(前端/执行核)
- 杨笠代言电脑遭投诉抵制,网友吵翻!英特尔回应了...
- 支付宝超硬硬件发布: 将颠覆现有支付方式!
- 在静态SQL中实现动态WHERE子句
- 转:Apache2 httpd.conf 中文版
- 基于单片机的自动追日系统设计_电机太阳论文,关于基于Atmega32的主动式太阳能追日系统相关参考文献资料-免费论文范文...
- 2020-03-28
- 技能get!如何使用PDF查找关键字
- 计算机桌面没有cd驱动器,win10没有cd驱动器怎么办_win10不显示dvd驱动器的解决方法...
热门文章
- stm32 薄膜键盘原理_铅锤哥:市面上的笔记本键盘优缺点解析,看完秒懂
- mysql如何选择多个表_从两个表mysql中选择多行
- oracle to_date 大写,oracle账号区分大小写吗2015第一博,Oracle时间段查询,TO_DATE和TO_CHAR使用对比...
- html动态生成按钮事件,javascript 动态生成按钮并添加事件时为什么不响应?
- nodejs mysql 返回值_带有Mysql数据库返回值的Nodejs
- B8.软件工程与设计模式
- 大数据学习笔记:创建与配置虚拟机[Ubuntu + CentOS]
- VB案例:泸职院教师评学评价表计算程序
- 【BZOJ1607】轻拍牛头,筛一筛
- 5.过滤器作为模板——模板匹配、Matlab模板匹配实战_2