在做Asp.Net MVC项目中,都知道View负责页面展示数据或者提供页面收集数据,而所展示的数据或者收集的数据都是从Controller的Action中获取或提交到Controller的Action。

这里的数据,可能是基础类型,或者是Model,或者是Model的部分内容,或者是集合比如List或Dictionary。

数据从View传递到Controller的Action时,有几种方式,RouteData(url中的路由数据),QueryString(http get的查询参数如?page=2),Forms(表单post的数据), 或者ajax交互的json数据。

而在Controller的action中,常常希望获得这些View传递的数据,并且最好能绑定到Action希望的类型,这些类型可能是Action的基础类型参数,或者需要更新的Model,或者只更新Model的部分内容,或者是一些集合的结构如List或Dictionary。

古董方法:

[AcceptVerbs(HttpVerbs.Post)]

publicActionResultCreate()

{

Reciperecipe = newRecipe();

recipe.Name = Request.Form["Name"];

// ...

returnView();

}

前进一步:

publicActionResultCreate(FormCollection values)

{

Reciperecipe = newRecipe();

recipe.Name = values["Name"];

// ...

returnView();

}

Asp.Net Mvc: Model Binding to Simple Types, Complex Types, Collections, Dictionaries, Etc

转:http://www.cnblogs.com/tristanguo/archive/2009/02/18/1393237.html

环境:

Windows 2008, VS 2008 SP1, Asp.Net Mvc 1.0

------------------------------------------------------------------------------

本文主要实验如何应用Asp.Net Mvc内建功能(DefaultModelBinder)实现简单类型、复杂类型、集合类型,以及字典类型的自动绑定。

1. 简单类型

这里,我们将下面这个Book类称为简单类型:

public class Book
{
public int BookId { get; set; }
public string BookName { get; set; }
public string Author { get; set; }
public DateTime PublishedDate { get; set; }
}

假设现在需要实现添加Book的功能,那么在BookController中,会定义如下的Action:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(Book book) {
//TO DO
//Insert book into Database
return RedirectToAction("Index");
}

现在的问题便是,在View中如何命名TextBox来达到自动绑定,如下:

<div>
<%using (Html.BeginForm("Create", "Book")) { %>
<div>
Book Name: <%=Html.TextBox("BookName")%>
</div>
<div>
Author: <%=Html.TextBox("Author")%>
</div>
<div>
Published Date: <%=Html.TextBox("PublishedDate")%>
</div>
<div>
<input type="submit" id="submit" name="submit" value="submit" />
</div>
<%} %>
</div>

注意TextBox的name必须是对应绑定类型的PropertyName(不区分大小写)。 这样,页面表单submit后,我们便可以在BookController的“Create” Action中得到自动绑定的book对象。这里,Asp.Net Mvc还支持在TextBox的name中加上变量名称前缀的情形:

<div>
<%using (Html.BeginForm("Create", "Book")) { %>
<div>
Book Name: <%=Html.TextBox("book.BookName")%>
</div>
<div>
Author: <%=Html.TextBox("book.Author")%>
</div>
<div>
Published Date: <%=Html.TextBox("book.PublishedDate")%>
</div>
<div>
<input type="submit" id="submit" name="submit" value="submit" />
</div>
<%} %>
</div>

需要注意的是: 1)前缀"book"必须与Action中接收的Book参数名一致 2)如果加了前缀,那么所有的都要加

2. 复杂类型

现在对Book类作些许改动,并引入Author类:

public class Book
{
public int BookId { get; set; }
public string BookName { get; set; }
public Author Author { get; set; }
public DateTime PublishedDate { get; set; }
} public class Author {
public int AuthorId { get; set; }
public string AuthorName { get; set; }
public string Nation { get; set; }
}

这里,将改动后的Book类称为复杂类。这时,Book类多了一个对Author类的引用。现在,保持BookController中的"Create" Action不变,来看View中的TextBox改如何命名以实现Book类型的自动绑定:

<div>
<%using (Html.BeginForm("Create", "Book")) { %>
<div>
Book Name: <%=Html.TextBox("BookName")%>
</div>
<div>
Published Date: <%=Html.TextBox("PublishedDate")%>
</div>
<div>
Author's Name: <%=Html.TextBox("Author.AuthorName")%>
</div>
<div>
Author's Nation: <%=Html.TextBox("Author.Nation")%>
</div>
<div>
<input type="submit" id="submit" name="submit" value="submit" />
</div>
<%} %>
</div>

OK,测试通过,想必你也知道命名规则了,要绑定Book类型中的Author类型,必须加上"Author."的前缀。 如果你喜欢,你还可以在所有TextBox名称前面再加"book."的前缀。

3. 集合类型

为避免问题复杂化,我们用回原来的简单Book类型:

public class Book
{
public int BookId { get; set; }
public string BookName { get; set; }
public string Author { get; set; }
public DateTime PublishedDate { get; set; }
}

现在,把BookController的"Create" Action改为接收IList<Book>的参数:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(IList<Book> books) {
//TO DO
//Insert book into Database
return RedirectToAction("Index");
}

然后,在View中运用以下命名规则,以自动绑定IList<book>类型

<div>
<%using (Html.BeginForm("Create", "Book")) { %>
<div>
Book Name: <%=Html.TextBox("books[0].BookName")%>
</div>
<div>
Published Date: <%=Html.TextBox("books[0].PublishedDate")%>
</div>
<div>
Author's Name: <%=Html.TextBox("books[0].Author")%>
</div>
<div>
Book Name: <%=Html.TextBox("books[1].BookName")%>
</div>
<div>
Published Date: <%=Html.TextBox("books[1].PublishedDate")%>
</div>
<div>
Author's Name: <%=Html.TextBox("books[1].Author")%>
</div>
<div>
<input type="submit" id="submit" name="submit" value="submit" />
</div>
<%} %>
</div>

可以看到如下规则:Action的变量名"books"加上中括号和索引作为前缀,索引必须从0开始,并且必须连续。 通过此命名规则,可以绑定任意集合类型:IList<Book>, ICollection<Book>, IEnumerable<Book>, List<Book>, Book[]等。

4. 字典类型

仍以简单Book类型为例,现在将"Create" Action改为接收IDictionary<Book>类型

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(IDictionary<string, Book> books) {
//TO DO
//Insert book into Database
return RedirectToAction("Index");
}

相应的,View中的命名如下:

<div>
<%using (Html.BeginForm("Create", "Book")) { %>
<div>
Book SN: <%=Html.TextBox("books[0].Key") %>
</div>
<div>
Book Name: <%=Html.TextBox("books[0].Value.BookName")%>
</div>
<div>
Published Date: <%=Html.TextBox("books[0].Value.PublishedDate")%>
</div>
<div>
Author's Name: <%=Html.TextBox("books[0].Value.Author")%>
</div>
<div>
Book SN: <%=Html.TextBox("books[1].Key") %>
</div>
<div>
Book Name: <%=Html.TextBox("books[1].Value.BookName")%>
</div>
<div>
Published Date: <%=Html.TextBox("books[1].Value.PublishedDate")%>
</div>
<div>
Author's Name: <%=Html.TextBox("books[1].Value.Author")%>
</div>
<div>
<input type="submit" id="submit" name="submit" value="submit" />
</div>
<%} %>
</div>

可以看出,对于IDictioinary<Book>类型,在命名规则上,相比于集合类型,多了"Key"和"Value”的字眼。另,此规则也适用于Action参数类型为Dictionary<Book>的情形。

总结:

由此看来,只要我们遵循一定的命名规则,就可以轻松实现各种类型的自动绑定了。 当然,Asp.Net Mvc还支持自定义ModelBinder扩展

Mvc内建功能(DefaultModelBinder)自动绑定。的更多相关文章

  1. asp.net mvc源码分析-DefaultModelBinder 自定义的普通数据类型的绑定和验证

    原文:asp.net mvc源码分析-DefaultModelBinder 自定义的普通数据类型的绑定和验证 在前面的文章中我们曾经涉及到ControllerActionInvoker类GetPara ...

  2. paip.提升效率---request自动绑定domain object

    paip.提升效率---request自动绑定domain object #.keyword,subtitle关键字,子标题 ------------------------- 复制request属性 ...

  3. 基于jquery的表格动态创建,自动绑定,自动获取值

    最近刚加入GUT项目,学习了很多其他同事写的代码,感觉受益匪浅. 在GUT项目中,经常会碰到这样一个问题:动态生成表格,包括从数据库中读取数据,并绑定在表格中,以及从在页面上通过jQuery新增删除表 ...

  4. 最新iOS 6 in Xcode4.5新特性——Storyboard和属性自动绑定

    最新iOS 6 in Xcode4.5新特性编程之二(上)——Storyboard和属性自动绑定 从Xcode 4.3开始,Storyboard 就是iOS 5和iOS 6中令人兴奋的一个新特性,他将 ...

  5. jQuery插件:Ajax将Json数据自动绑定到Form表单

    jQuery注册方法的两种常用方式: //jQuery静态方法注册 //调用方法$.a1() $.extend({ a1: function () { console.log("a1&quo ...

  6. spring mvc: 多解析器映射(资源绑定视图解析器 + 内部资源[普通模式/]视图解析器)

    spring mvc: 多解析器映射(资源绑定视图解析器 + 内部资源[普通模式/]视图解析器) 资源绑定视图解析器 + 内部资源(普通模式)视图解析器 并存方式 内部资源视图解析器: http:// ...

  7. snowflake机器标识自动绑定

    首先附上snowflake源码 package com.yunyihenkey.common.idworker; /** * Twitter_Snowflake<br> * SnowFla ...

  8. FlexiGrid 使用 全选、自动绑定

    1.介绍 Flexigrid是一个类似于Ext Gird,但基于jQuery开发的Grid.它具有的功能包括:可以调整列宽,合并列标题,分页,排序,显示/隐藏表格等.Flexigrid显示的数据能够通 ...

  9. WinForm开发-界面控件到实体,实体到界面控件自动绑定

    在WinForm开发中,我们是不是为绑定界面控件的数据而每个控件每个控件的赋值?在保存修改时是不是也是每个控件每个控件的赋值到实体中?字段一多,那简直就是噩梦.有没有像Web中那样方便的方法直接就自动 ...

随机推荐

  1. AttributeError: ‘module’ object has no attribute ‘ximgproc’(OpenCV)

    问题描述: 使用opecv实现选择性搜索(selective search)的时候,执行如下代码时报了上述标题的错误. “ss = cv2.ximgproc.segmentation.createSe ...

  2. 运维利器:钉钉机器人脚本告警(Linux Shell 篇)

    写在前面的话 目前换了几家公司,且最近几家都是以钉钉作为公司 OA 聊天工具,总的来说还是很不错的.最近去了新公司,由于公司以前没有运维,所以监控,做自动化等方面都没有实施,恰逢这个机会把最近做的关于 ...

  3. UIApplication直接应用

    /************ 当程序载入后执行,应用程序启动入口 *****************************/ - (BOOL)application:(UIApplication *) ...

  4. B - Pie (二分)

    My birthday is coming up and traditionally I'm serving pie. Not just one pie, no, I have a number N ...

  5. shell脚本编程的10个最佳实践

    摘要:每一个在UNIX/Linux上工作的程序员可能都擅长shell脚本编程.对于那些处在shell脚本编程初级阶段的程序员来说,遵循一些恰当的做法可以帮助你更快.更好的学习这些编程技巧. 每一个在U ...

  6. 【bzoj2186】: [Sdoi2008]沙拉公主的困惑 数论-欧拉函数

    [bzoj2186]: [Sdoi2008]沙拉公主的困惑 考虑当 gcd(a,b)=1 则 gcd(nb+a,b)=1 所以[1,N!]与M!互质的个数就是 筛出[1,M]所有的素数p[i] 以及逆 ...

  7. Qt 学习之路 2(10):对象模型

    Home / Qt 学习之路 2 / Qt 学习之路 2(10):对象模型 Qt 学习之路 2(10):对象模型  豆子  2012年9月2日  Qt 学习之路 2  45条评论 标准 C++ 对象模 ...

  8. php curl 请求api 接口

    官方文档curl : http://www.runoob.com/php/php-ref-curl.html php开启curl :  ① 打开 php.ini 文件  extension=php_c ...

  9. 原 tomcat的server.xml配置文件中三个端口的作用

    以Tomcat7.0为例, 在安装目录下. conf/server.xml 中可以配置三个端口号, 如果使用多个tomcat 是需要配置这三个. 该Connector 用于监听请求. protocol ...

  10. my.资料_副本_破六欲

    http://www.nok2.com/fxjy/816.html 梦幻之家礼包网讲解梦幻2破除心魔 来源:www.nok2.com作者:礼包达人时间:2016-04-01 22:11 最近听到不少小 ...