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

  • CloudHosting平台Eucalyptus分析.

    2009-10-20 18:21:00

    摘要: Eucalyptus架构特征 非侵入式 高度模块化(highly modular cooperative) 采用公开,标准的通信协议 API与AWS兼容(SOAP & REST)

  • 利用jQuery实现页面渐显效果

    2009-9-23 16:44:00

    摘要: 最近在看jQuery,就在实际项目里加了个小的应用,当时的想法就是点击一个链接跳转到另个页面时,页面是逐渐显示出来,也就是由透明到实体的一个过程!  说下思路吧,在body里用一个div把所

  • LDataGrid--在客户端运行的DataGrid

    2009-4-11 23:23:00

    摘要: 我开发的其它控件 源代码及示例下载 LDataGrid是一个功能类似DataGrid的控件,不同的是,LDataGrid是在客户端运行的 LDataGrid使用指南 1.引用相关Jav

  • 让我郁闷的.net

    2011-1-2 3:40:00

    我要打印相同的文章多份,弄死也做不出来!! 只得不断调用PRINT(),打印机停一下又启动打印,如果我打印20份,就要启动和停止20次,后来只有用Delphi了。

  • FMS3系列(五):通过FMS实现时时视频聊天(Flash|Flex)

    2009-4-28 1:06:00

    本系列的前几篇文章中分别介绍了,连接FMS服务器、建立播放程序以及在线视频录制以及回放等功能的实现。相信看过前面几篇文章的朋友已经对FMS有了一定的认识,并熟悉了常用的编程模式。本文将结合前面几篇文

  • flash缓动类

    2009-7-12 1:12:00

    原文地址: http://www.laaan.cn/?p=972 昨天研究了会缓动类, 可以看一个应用》》 ,今天整理了一下,这里简单介绍一下: 一个简单例子:

  • WinForm界面开发之“OutLookBar”工具条

    2009-7-10 21:29:00

    在很多软件界面中,一个好的界面、方便的导航除了为软件增色不少外,也提高了用户体验,促进软件的良性发展,因为我们的软件一般需要有菜单、工具条、状态条等这些基本的东西,但是工具条本身应该是一些常用的快捷

  • IBatis.Net学习笔记四--数据库的缓存模式

    2007-8-20 18:04:00

    摘要: 在IBatis中提供了数据库缓存的模式,可以提高访问效率。对于一些不常更新的表可以直接利用IBatis的缓存方式。 要使用IBatis的数据库缓存,只要利用配置文件就可以了,实现起来比

  • ASP.NET Web API - Screencast series with downloadable sample code - Part 1

    2012-3-17 2:43:00

    Theres a lot of great ASP.NET Web API content on the ASP.NET website at http://asp.net/web-api . I

  • 使用Visual Studio宏来自动生成代码 [ Visual Studio | 宏 | 自动生成代码 ]

    2009-6-25 9:54:00

    前言 宏的定义:是组合到一起形成一个命令以自动完成某项任务的一系列命令和指令。(MSDN) 在使用Visual Studio宏实现JS折叠功能的时候就想过用它来实现代码自动生成