博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MVC框架中的值提供机制(二)
阅读量:6092 次
发布时间:2019-06-20

本文共 2984 字,大约阅读时间需要 9 分钟。

     在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

你可能感兴趣的文章
vim学习与理解
查看>>
DIRECTSHOW在VS2005中PVOID64问题和配置问题
查看>>
MapReduce的模式,算法以及用例
查看>>
《Advanced Linux Programming》读书笔记(1)
查看>>
zabbix agent item
查看>>
一步一步学习SignalR进行实时通信_7_非代理
查看>>
为什么我弃用GNOME转向KDE(2)
查看>>
Redis学习记录初篇
查看>>
爬虫案例若干-爬取CSDN博文,糗事百科段子以及淘宝的图片
查看>>
Web实时通信技术
查看>>
第三章 计算机及服务器硬件组成结合企业运维场景 总结
查看>>
IntelliJ IDEA解决Tomcal启动报错
查看>>
默认虚拟主机设置
查看>>
php中的短标签 太坑人了
查看>>
[译] 可维护的 ETL:使管道更容易支持和扩展的技巧
查看>>
### 继承 ###
查看>>
数组扩展方法之求和
查看>>
astah-professional-7_2_0安装
查看>>
函数是对象-有属性有方法
查看>>
uva 10107 - What is the Median?
查看>>