在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框架中的值提供机制(二)相关推荐

  1. 使用MVC框架中要注意的问题(二):将Model和Controller单独用一个项目设计

    这个问题很多朋友都会问到,MVC让分工协作成为了可能.但如果所有代码和页面都在一个项目中的话,那么分工就会受到限制.其实,Model和Controller都可以单独用一个(或者多个)程序单独来做. 1 ...

  2. thinkph 上花院 生多行mysql_PHP_ThinkPHP3.1基础知识快速入门,在当今众多的MVC框架中,ThinkPH - phpStudy...

    ThinkPHP3.1基础知识快速入门 在当今众多的MVC框架中,ThinkPHP是一个快速.简单的基于MVC和面向对象的轻量级PHP开发框架,其遵循Apache2开源协议发布,自从诞生以来一直秉承简 ...

  3. mvc identity连接mysql_asp.net MVC5,如何使用mysql数据库,使用MVC框架中自带的identity用户验证体系...

    问题如题 现在很多时候,即使是.net项目,我们用的数据库也未必时是 SQL Server了. 但很多VS 自带的框架(如MVC .WebAPI等框架)中的示例自带的仍然是默认Sql Server的, ...

  4. Spring MVC框架中关于限制请求方式

    在Spring MVC框架中,@RequestMapping注解的主要作用是配置请求路径,除此以外,还可以配置请求方式,例如: @RequestMapping(value = "/add-n ...

  5. MVC框架中的前端与后端数据传递及实例

    一.MVC框架 MVC代表Model.View.Controller,即模型.视图.控制器.其中: View(视图):就是人机交互界面,可以给用户显示业务逻辑数据,同时也可以 接收用户输入的数据. M ...

  6. python处理信号机制_Python的Flask框架中的signals信号机制

    Flask 提供了信号(Signals)功能,是一种消息分发机制.类似于钩子(Hooks).使用信号功能可以降低程序的耦合,分解复杂的业务模型.例如在更新了产品数据后,可以发送一个信号.当有需要对产品 ...

  7. php的ddd,在MVC框架中实现DDD – PHP

    在mvc中,模型是一个层,它包含所有的域业务逻辑. 在域驱动设计中,业务逻辑可以分为各种构建块. 在域驱动设计域模型中. A domain model is a system of abstracti ...

  8. 找到MVC框架中前端URL与后端同步的解决方案

    基本思路: 先用URL标签生成完整的URL字符,前端动态参数的部分以适配符先填充,最后动态参数利用正则匹配进行替换. 这种方式,可以在各种MVC框架中适用,妙. 不废话,上码. var url = & ...

  9. Java Web学习总结(30)——Service层在MVC框架中的意义和职责

    mvc框架由model,view,controller组成,执行流程一般是:在controller访问model获取数据,通过view渲染页面. mvc模式是web开发中的基础模式,采用的是分层设计, ...

最新文章

  1. 存储过程由结构表生成表
  2. 写给工程师的十条精进原则
  3. 有限状态机HDL模板
  4. php连接postgresql
  5. 原创:MS Dynamics AX - XBRL 功能
  6. 伯努利数与自然数幂和
  7. 数据库事务及隔离级别
  8. 教你开发jQuery插件(转)
  9. 用matlab绘制外部导入数据图像,matlab 外部数据导入方法详解(3)
  10. Verilog HDL中阻塞语句和非阻塞语句的区别
  11. 媒体查询-响应式布局-BFC
  12. Intel超线程技术 Hyper-Threading Technology (5) - 微架构/流水线与超线程技术(前端/执行核)
  13. 杨笠代言电脑遭投诉抵制,网友吵翻!英特尔回应了...
  14. 支付宝超硬硬件发布: 将颠覆现有支付方式!
  15. 在静态SQL中实现动态WHERE子句
  16. 转:Apache2 httpd.conf 中文版
  17. 基于单片机的自动追日系统设计_电机太阳论文,关于基于Atmega32的主动式太阳能追日系统相关参考文献资料-免费论文范文...
  18. 2020-03-28
  19. 技能get!如何使用PDF查找关键字
  20. 计算机桌面没有cd驱动器,win10没有cd驱动器怎么办_win10不显示dvd驱动器的解决方法...

热门文章

  1. stm32 薄膜键盘原理_铅锤哥:市面上的笔记本键盘优缺点解析,看完秒懂
  2. mysql如何选择多个表_从两个表mysql中选择多行
  3. oracle to_date 大写,oracle账号区分大小写吗2015第一博,Oracle时间段查询,TO_DATE和TO_CHAR使用对比...
  4. html动态生成按钮事件,javascript 动态生成按钮并添加事件时为什么不响应?
  5. nodejs mysql 返回值_带有Mysql数据库返回值的Nodejs
  6. B8.软件工程与设计模式
  7. 大数据学习笔记:创建与配置虚拟机[Ubuntu + CentOS]
  8. VB案例:泸职院教师评学评价表计算程序
  9. 【BZOJ1607】轻拍牛头,筛一筛
  10. 5.过滤器作为模板——模板匹配、Matlab模板匹配实战_2