我抓我的头部,一位在如何型号的粘合剂做他们的工作ASP.Net 视.

具体来说,BindModel()方法有一个ModelBindingContext参数,拥有的型号名称和类型,但是我不明白如何ModelBindingContext接收这些价值观。

一个视模式有可以填充张贴的形式值或查询串的参数,或其他来源的数据。但是什么机制确定的模式类型交给ModelBindingContext,以及如何为一个模式类型选择的另一个模型,甚至超过(说)一个简单的列表,包含个人公布的价值观?

它只是显示我的ModelBindingContext"知道"的类型模型,它被移交,而且我不知道在哪里这是来自或前的工作流程的参与填充。

有帮助吗?

解决方案

有趣的问题。这是MVC所做的简单概述。所有这些都是由ControllerActionInovker类处理的。这不是特定顺序,而是接近。

  1. ControllerActionInovker通过反射确定参数类型。
  2. 下一个ValueProviders是从HTTPContext请求表,路由,查询等属性创建的。您还可以提供自己的价值提供商。
  3. 这些估值通过用作虚拟估值者的集合将其提供给模型BindingContext。
  4. 然后,ControllerActionInovker为特定类型寻找模型框。如果找不到一个,则默认为内置的defaultModelBinder。
  5. 在大多数情况下,使用DefaultModelBinder。它的工作是创建一个模型,并使用ValueProviders使用模型属性名称作为键将属性与值连接。当valueeproviders具有价值时,他们返回负责类型转换的ValueProviderResult对象。

您可以在 ASP.NET MVC源位于codeplex.com. 。查找ControllerActionInVoker类和GetParameTervalue方法。

其他提示

ModelBindingContext“知道”它正在交出的模型类型,因为您必须要这样做:

  • 将模型属性添加到您的模型
  • 使用modelbinders.binders.add()方法向模型注册模型。

ModelBinder属性的示例:

[ModelBinder(typeof(ContactBinder))]
public class Contact { ... }

modelbinders.binders.add()的示例:

void Application_Start()
{
  ModelBinders.Binders[typeof(Contact)] = new ContactBinder();
}

如果您已经注册了模型Binder并实现了BindModel方法:

public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { ... }
  1. 查询ModelBindingContext.modeltype等于您的模型

    if (bindingContext.ModelType == typeof(Contact)) { ... }
    
  2. 从ModelBindingContext.ValueProvider属性中补充您的模型,以检索代表来自表单帖子,路由数据和查询字符串EG的数据的ValueProviderResult实例

    bindingContext.ValueProvider["Name"].AttemptedValue;
    

使用以下书籍ASP.NET MVC 2行动ASP.NET MVC 1.0快速

我看到它的方式是,ControllerActionInvoker使用反射获得的参数类型,然后检查,如果任何ModelBinder是分配给处理该类型,如果它实例化这ModelBinder并将它BindingContext其中将包含(模型的目的,型号名称、型号、财产过滤器)的参数类型的对象和价值提供者收集(ModelBindingContext.ValueProvider)的所有其他价值提供者(表,查询串等), 作为一个虚拟大的价值提供者。

该ModelBinder然后自己使用反射获得的所有财产名称的类型,其分配给结合并运行自身递归对所有价值的提供者(ModelBindingContext.ValueProvider),并寻找酒店的名字在那些值供应商,结合这些价值观的人的姓名(从客户)类型相匹配的财产的名称,当它们匹配的价值提供者返回ValueProviderResult目的,承的名称和价值的各自财产的型号。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top