当前位置 > 首页 > 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) 是

  • ASP.NET MVC: Getting selected values from CheckBoxList

    2011-5-6 7:12:00

    In my last posting I introduced how to implement CheckBoxList in ASP.NET MVC . Showing checkbox li

  • Announcing EmailVerify.NET v3.0

    2009-10-30 6:52:00

    As the company lead developer, Im proud to announce to my readers that our award winninge-mail veri

  • win7 上安装 vs2008和打VS2008 SP1补丁的痛苦经历

    2009-5-16 5:18:00

    前几天装了WINDOWS7,我以前一直用XP,没有用过VISTA,装了WIN7后把访问控制调到最低,就不会老弹出东西了。用起来还比较习惯。虽然本本的多媒体键和指纹识别用不了。不过还是可以接受的。

  • 【STM32 .Net MF开发板学习-18】GPRS遥控智能小车

    2010-11-5 0:38:00

    有了 Wifi 间接控制智能小车的经验,很自然的想到,也可以通过 GPRS 远程遥控智能小车,因为从通信原理上看,二者其实没有什么本质的不同,都是基于 Socket 的 TCP 通信,其控制环节如下

  • ASP.NET Forums 页面模型分析

    2007-1-28 20:30:00

    摘要: 发表自己对Asp.net Forums 2的页面代码组织方式一点浅薄的认识。写此篇文章,大量参考了venjiang,宝玉,ugoer等诸位大哥的文章,在次对他们表示衷心的感谢,首次发文章,文

  • .NET一个线程更新另一个线程的UI(两种实现方法)

    2012-11-12 19:36:00

    本片博文接上一篇: .NET多线程执行函数 ,给出实现一个线程更新另一个线程UI的两种方法。 Winform中的控件是绑定到特定的线程的(一般是主线程),这意味着从另一个线程更新主线程的控件不能直

  • WPF/E Sample:开发简单的饼形报表

    2007-1-26 17:41:00

    学习 WPF/E 也有一段日子了。前段时间老想着用 WPF/E 能画什么好。也许画个动态的 2D 报表,是个不错的选择。 示例中主要使用

  • ASP.NET Web Forms Extensibility: Control Adapters

    2012-9-14 2:13:00

    All ASP.NET controls from version 2.0 can be associated with a control adapter. A control adapter i

  • 国内项目开发过程分析总结

    2007-8-30 19:49:00

    我最近想写一篇关于国内项目开发过程分析的总结,目前列出了这些项目的一些阶段,希望得到大家的支持,多提意见。我会近期完善本文的。 希望dudu让我放首页收集下各位朋友的意见 谢谢!!!

  • 趣味问题:你能用Reflection.Emit生成这段代码吗?

    2009-11-30 9:18:00

    阅读: 12 评论: 0 作者: 装配脑袋 发表于 2009-11-30 09:09 原文链接 众所周知,Reflection.Emit是非常强大的工具,可以在运行时动态生成各种程序集、类