统一的数据获取
在WebForm时代,我们是怎么获取值的呢?
HttpContext.Request.QueryString
HttpContext.Request.Form
HttpContext.Request.Files
当然,也可以直接使用HttpContext.Request[] 的方式统一获取。因为内部把这几种获取方式都走了一遍
而在MVC中我们是如果获取值的呢
在action中我们可以轻松优雅的使用形参接收请求值,无论是Post,Get请求。都可以轻松的获取到值,这是怎么回事呢。
public static class ValueProviderFactories { private static readonly ValueProviderFactoryCollection _factories; static ValueProviderFactories() { ValueProviderFactoryCollection factorys = new ValueProviderFactoryCollection(); factorys.Add(new ChildActionValueProviderFactory()); factorys.Add(new FormValueProviderFactory()); factorys.Add(new JsonValueProviderFactory()); factorys.Add(new RouteDataValueProviderFactory()); factorys.Add(new QueryStringValueProviderFactory()); factorys.Add(new HttpFileCollectionValueProviderFactory()); factorys.Add(new JQueryFormValueProviderFactory()); _factories = factorys; } public static ValueProviderFactoryCollection Factories => _factories; }
Mvc中IValueProvider接口对获取数据做了一个统一,接口中有一个GetValue方法。上图的共七个ValueProvider就是及实现类,可以看到熟悉的身影。比如 QueryStringValueProvider,FormValueProvider
-
ChildActionValueProvider 上篇博文写到了子视图(分布视图) Action的传值就是这个ValueProvider获取
-
JsonValueProvider Mvc会把请求过来的参数转化成实体,其实一点也不神奇,就是这个ValueProvider在操作
-
RouteDataValueProviderFactory 获取匹配路由的Provider
-
JQueryFormValueProvider 从名字也可以看出来,使用JQForm组件请求来的参数
值得一提的是这几个ValueProvide其中有继承自DictionaryValueProvider、有的继承NameValueCollectionValueProvider
当一个请求过来的时候,MVC会把这几个ValueProvider都走一遍,如果有值,则返回值,没有值则走下一个ValueProvider,如下图
ValueProvider这么神奇?我怎么没见过
这么一个牛掰的东西,我们在开发中为什么没有使用过呢 ? 因为它本身就不是为我们手动使用准备的。我们在action中轻松的拿到请求参数得益于defalutModelbinder(模型绑定器) 在这个类中大量的使用到了valueProvider,使请求的数据绑定到我们的action参数中。