MVC请求过程中中各组件调用顺序:值提供组件(IValueProvider)-》模型绑定组件(IModelBinder)-》模型验证组件

值提供组件接口

public interface IEnumerableValueProvider : IValueProvider
{
IDictionary<string, string> GetKeysFromPrefix(string prefix);
} public interface IUnvalidatedValueProvider : IValueProvider
{
ValueProviderResult GetValue(string key, bool skipValidation);
}

ASP.NET MVC 包括值提供程序的实现,这些实现涵盖了大多数常见请求值源,例如查询字符串参数、表单字段和路由数据。

在运行时,ASP.NET MVC 使用 ValueProviderFactories(静态类,包含一个工厂集合) 类中注册的值提供程序计算模型绑定程序可以使用的请求值。

public static class ValueProviderFactories
{
public static ValueProviderFactoryCollection Factories { get; }
}

默认情况下,值提供程序集合按下面的顺序计算来自各种源的值:

  1. 以前绑定的操作参数(当该操作为子操作时)
  2. 表单字段 (Request.Form)
  3. JSON 请求主体中的属性值 (Request.InputStream),但仅当该请求为 AJAX 请求时
  4. 路由数据 (RouteData.Values)
  5. 查询字符串参数 (Request.QueryString)
  6. 已发布文件 (Request.Files)

值提供程序集合如同 Request 对象一样,实际上只不过是一个所谓的字典,即模型绑定程序可以使用且无需知道数据来源的键/值对的抽象层。 然而同 Request 字典相比,值提供程序框架进一步实现了这种抽象,它允许你完全控制模型绑定框架获取其数据的方式及位置。

MVC为每一个值提供器提供了一个工厂:ValueProviderFactory

下面的列表列出了定义在Model绑定系统中的6个原生的ValueProviderFactory:

  • ChildActionValueProviderFactory:根据给定的Controller上下文创建一个ChildActionValueProvider对象。
  • FormValueProviderFactory:根据给定的Controller上下文创建一个FormValueProvider对象。
  • JsonValueProviderFactory:将以JSON形式表示的请求数据转换成一个Dictionary<string, object>对象,并最终创建一个DictionaryValueProvider<object>对象。
  • RouteDataValueProviderFactory:根据给定的Controller上下文创建一个RouteDataValueProvider对象。
  • QueryStringValueProviderFactory:根据给定的Controller上下文创建一个QueryStringValueProvider对象。
  • HttpFileCollectionValueProviderFactory:根据给定的Controller上下文创建一个HttpFileCollectionValueProvider对象。

次序(优先级)为:ChildActionValueProviderFactory、FormValueProviderFactory、JsonValueProviderFactory、RouteDataValueProviderFactory、QueryStringValueProviderFactory和HttpFileCollectionValueProviderFactory

值提供组件的继承关系

1,NameValueCollectionValueProvider类(public class NameValueCollectionValueProvider : IUnvalidatedValueProvider, IEnumerableValueProvider, IValueProvider)
NameValueCollectionValueProvider具有两个继承者,即FormValueProvider和QueryStringValueProvider

public sealed class FormValueProvider : NameValueCollectionValueProvider{}

public sealed class QueryStringValueProvider: NameValueCollectionValueProvider{}

2,DictionnaryValueProvider/DictionaryValueProvider<TValue>类(public class DictionaryValueProvider<TValue> : IEnumerableValueProvider, IValueProvider)

NameValueCollection和Dictionnary都是一个键值对的集合,它们之间的不同之处在NameValueCollection运行元素具有相同的Key,Dictionnary却要求元素的Key具有唯一性!

DictionaryValueProvider<TValue>具有三个继承者,RouteDataValueProvider、HttpFileCollectionValueProvider、ChildActionValueProvider

public sealed class RouteDataValueProvider : DictionaryValueProvider<object>{}

public sealed class HttpFileCollectionValueProvider : DictionaryValueProvider<HttpPostedFileBase[]>{}

public sealed class ChildActionValueProvider : DictionaryValueProvider<object>{}

3,ValueProviderCollection类

类型ValueProviderCollection不仅仅表示一个ValueProvider对象的集合,还作为一个单纯的ValueProvider来使用

public class ValueProviderCollection : Collection<IValueProvider>, IUnvalidatedValueProvider, IEnumerableValueProvider, IValueProvider{}

4,通过FormCollection类读取表单数据

//.net
public sealed class FormCollection : NameValueCollection,
IValueProvider{}
//使用方式,控制器内
public ActionResult FormCollection(FormCollection formCollection)
{
string name=formCollection["name"];
}
public ActionResult FormCollection(FormCollection formCollection)
{
if (ModelState.IsValid)
{
var user = new User();
//利用控制器的TryUpdateModel方法,进行转换
TryUpdateModel<User>(user, formCollection); }
}

FormCollection和Requert.Form都是NameValueCollection,他们之间有什么区别?

FormCllection是Request.Form的包装,其在内部实现了IModelBinder(private sealed class FormCollectionModelBinder),接口实现包装了(controllerContext.HttpContext.Request.Form和controllerContext.HttpContext.Request.Unvalidated.Form)

获取的值都是String类型,但是FormCllection是专门为MVC服务的。

1,Request类来自System.Web程序集,不方便测试,而且可移植性差,最新的.net core跨平台移除了对此程序集的依赖

2,Request.Form是只读集合,FormCollection则可以进行修改,

3,FormCollection实现了IValueProvider,可以利用MVC的机制,通过调用Controller.UpdateModel(TModel,FormCollection)进行手动模型更新。

参考:http://www.cnblogs.com/artech/archive/2012/05/17/value-provider-01.html

MVC值提供组件ValueProvider的继承关系的更多相关文章

  1. Java awt组件间的继承关系

    Container的继承关系: Window是可独立存在的容器,其他则不行.

  2. ValueProvider核心的值提供系统

    Model绑定的数据具有多种来源: 提交的表单 Json字符串 当前路由数据 请求地址的查询字符串 ASP.NET MVC将这种基于不同数据来源的数据提供机制实现在ValueProvider的组件中 ...

  3. MVC框架中的值提供机制(二)

    在MVC框架中存在一些默认的值提供程序模板,这些值提供程序都是通过工厂模式类创建;在MVC框架中存在需要已Factory结尾的工厂类,在值提供程序中也存在ValueProviderFactories工 ...

  4. drf:restful概念,类继承关系,drf请求封装,drf请求流程,版本控制组件,认证组件(token),权限组件

    1.restful规范 resfful规范的概念最重要: 是一套规范,规则,用于程序之间进行数据交换的约定. 他规定了一些协议,对我们感受最直接的就是,以前写增删改查的时候需要些四个视图寒素,rest ...

  5. MVC框架中的值提供机制(三)

    在MVC框架中NameValueCollectionValueProvider采用一个NameValueCollection作为数据源,DictionnaryValueProvider的数据源类型自然 ...

  6. MVC框架中的值提供机制(一)

    在MVC框架中action方法中的Model数据的绑定的来源有很多个,可能是http请求中的get参数或是post提交的表单数据,会是json字符串或是路径中的相关数据;MVC框架中针对这些不同的数据 ...

  7. mvc action 参数绑定——值提供器【学习笔记】

    每次http请求的各种数据(表单数据.url的数据.路由数据等等)都保存在不同的IValueProvider接口的实现类中. 而IValueProvider接口的实现类是通过ValueProvider ...

  8. 扯谈spring mvc之WebApplicationContext的继承关系

    spring mvc里的root/child WebApplicationContext的继承关系 在传统的spring mvc程序里会有两个WebApplicationContext,一个是pare ...

  9. QObject提供了QMetaObject元类信息(相当于RTTI和反射),信号与连接,父子关系,调试信息,属性,事件,继承关系,窗口类型,线程属性,时间器,对象名称,国际化

    元类信息(相当于RTTI和反射),信号与连接,父子关系,调试信息,属性,事件,继承关系,窗口类型,线程属性,时间器,对象名称,国际化其中元类又提供了:classInfo,className,构造函数, ...

随机推荐

  1. vba打开excel文件遍历sheet的名字和指定单元格的值

    今天项目上有个应用,获取指定Excel文件下的所有sheet的名称以及当前sheet中指定单元格的值,并把他们写到固定的sheet中去,看了下,文件比较多,而且每个文件sheet的个数比较多,也不一样 ...

  2. IIS安装步骤(WIN10)

    打开控制面板 点开程序   点击“启动或关闭Windows功能,进入到启用或关闭windows功能之后我们选中“Internet Infomation Services”并勾选   点击确定     ...

  3. weblogic控制台的启动与禁用

    在一些安全漏洞扫描中,经常会扫描发现,使用weblogic管理控制台,会有个中危的漏洞. http://192.168.10.46:7001/console/login/LoginForm.jsp W ...

  4. AbstractIdleService

    该类有一个startup和shutdown方法,启动此服务或者结束此服务的时候可以调用. Runtime.getRuntime().addShutdownHook(new Thread() {@Ove ...

  5. Jmeter ----关于上传图片接口

    转自:http://www.cnblogs.com/linglingyuese/p/4514808.html 需求 1 2 3 4 5 6 7 8 9 post上传   Request: { &quo ...

  6. CentOS7 日期时间设置

    1.设置系统时间为中国时区并启用NTP同步 yum install ntp //安装ntp服务 systemctl enable ntpd //开机启动服务 systemctl start ntpd ...

  7. Laravel5 cookie和session设置 Cookie::queue()自动添加

    Cookies Laravel会加密所有已创建的cookie信息,并附加上授权码,当客户端擅自修改cookie信息时,该cookie将被废弃,从而保证安全性. 获取一个指定的cookie值 $valu ...

  8. mybatis foreach标签的解释 与常用之处

    情景:查询数据库中文章的相关文章   文章为一个表 字段tags为相关文章字符串中间用','逗号进行啦分割 查询完一个文章后可以把tags字段构造为一个List<String> 然后利用这 ...

  9. TIMEQUEST学习之黑金动力(三)

    不知不觉,学到的第四章.但是对于TQ的内部模型和外部模型的完整分析还是没有很好的理解.接着学习......... 我们也了解静态时序分析的第一步骤,亦即时钟方面的约束.此外,也稍微对 Report T ...

  10. 如何卸载win10的自带应用

    win10自带了好多应用,有些看起来不错,其实用起来不太方便哈(我的个人感觉),我们都更喜欢第三方应用,所以我们就来看看如何卸载这些自带应用.如图,是卸载完成后的Windows PowerShell: ...