当前位置 > 首页 > Asp.net

深入ASP.NET MVC之五:Model Binding

2012-11-23 7:42:00来源:Asp.net

在上文中,谈到在action方法被执行的过程中,调用了ControllerActionInvoker的GetParameterValues方法来获得action的参数,上文没有细谈,在这个方法里面,实现了ASP.NET MVC的Model Binding功能。ASP.NET的Model Binding主要有两个接口组成,分别是:

public interface IModelBinder {
object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext);
}
public interface IValueProvider {
bool ContainsPrefix(string prefix);
ValueProviderResult GetValue(string key);
}

这两个接口都非常简单,BindModel是真正实现数据绑定的地方,ModelBindingContext有个属性是ValueProvider用来给BindModel提供数据。ASP.NET MVC的Model Binding的“骨架”其实也不复杂,比较繁琐的是这两个接口的实现,这两个接口的实现才是真正实现绑定功能的地方。ASP.NET MVC有一些默认实现,DefaultModelBinder和一系列的ValueProvider:FormValueProvider,QueryStringProvider等,IValueProvider可以将form中的表单,querystring中的数据等抽象为键值对,对于ModelBinder来说,他并不知道这些数据是通过什么地方来的。Model Binding有两方面的功能,一是将提交上去的数据绑定到action方法的参数中,另一方面是将对象的值显示到view中,本文先侧重前一个方面。先看DefaultModelBinder的功能,简单说,这个Model Binder主要是根据Action方法的参数的名字和通过http request提交上去的Key-Value pair中的key进行比对从而进行绑定。具体来说,又分为很多情况。作为例子,如下定义几个类型:

public class Person
{
public string Name { get; set; }

public int Age { get; set; }

public Address Add { get; set; }

public List<Course> Courses { get; set; }
}

public class Address
{
public string City { get; set; }
public string Street { get; set; }
}

public class Course
{
public string Name { get; set; }
public int Id { get; set; }
}

(1)简单类型,比如 Action(string abc),这种情况会将 key=abc的值直接赋值给abc这个参数。

(2)复杂类型,采用递归的手法进行绑定。

  1.          (2.1)如果是数组或者IEumerable<T>的,例如 Action(List<Course> courses),内部创建一个List,进行数组绑定。数组绑定的时候,对key有如下要求,
  2.                    (2.1.1) 是