ASP.Net MVC ModelBindingContext类 - 如何填充其模型值?

lar*_*ryq 8 asp.net-mvc modelbinders custom-model-binder

我对于模型绑定器在ASP.Net MVC中的工作方式略有不解.

具体来说,BindModel()方法有一个ModelBindingContext参数,它保存模型名称和类型,但我不明白ModelBindingContext如何接收这些值.

必须从发布的表单值或查询字符串参数或其他数据源填充MVC模型.但是什么机制决定了传递给ModelBindingContext的模型类型,以及如何选择一种模型类型而不是另一种模型类型,甚至是(包括)包含各个发布值的简单列表?

在我看来,ModelBindingContext"知道"它所交付的模型的类型,我不确定它的来源或填充它所涉及的工作流程.

小智 12

有趣的问题.以下是MVC的功能简单概述.它全部由ControllerActionInovker类处理.这不是特定的顺序,而是接近.

  1. ControllerActionInovker通过反射确定参数类型.
  2. 下一个ValueProviders是从HttpContext Request Form,Route,QueryString等属性创建的.您还可以提供自己的价值提供者.
  3. 这些ValueProviders通过充当虚拟ValueProvider的集合提供给ModelBindingContext.
  4. 然后ControllerActionInovker查找特定类型的ModelBinder.如果找不到,则默认为内置的DefaultModelBinder.
  5. 在大多数情况下,使用DefaultModelBinder.它的工作是创建一个Model,并使用ValueProviders使用模型属性名称作为键将属性与值连接起来.当ValueProviders有值时,它们返回一个负责类型转换的ValueProviderResult对象.

您可以在位于codeplex.comASP.net MVC源中自行查看.查找ControllerActionInvoker类和GetParameterValue方法.