Mvc内建功能(DefaultModelBinder)自动绑定。
在做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)自动绑定。的更多相关文章
- asp.net mvc源码分析-DefaultModelBinder 自定义的普通数据类型的绑定和验证
原文:asp.net mvc源码分析-DefaultModelBinder 自定义的普通数据类型的绑定和验证 在前面的文章中我们曾经涉及到ControllerActionInvoker类GetPara ...
- paip.提升效率---request自动绑定domain object
paip.提升效率---request自动绑定domain object #.keyword,subtitle关键字,子标题 ------------------------- 复制request属性 ...
- 基于jquery的表格动态创建,自动绑定,自动获取值
最近刚加入GUT项目,学习了很多其他同事写的代码,感觉受益匪浅. 在GUT项目中,经常会碰到这样一个问题:动态生成表格,包括从数据库中读取数据,并绑定在表格中,以及从在页面上通过jQuery新增删除表 ...
- 最新iOS 6 in Xcode4.5新特性——Storyboard和属性自动绑定
最新iOS 6 in Xcode4.5新特性编程之二(上)——Storyboard和属性自动绑定 从Xcode 4.3开始,Storyboard 就是iOS 5和iOS 6中令人兴奋的一个新特性,他将 ...
- jQuery插件:Ajax将Json数据自动绑定到Form表单
jQuery注册方法的两种常用方式: //jQuery静态方法注册 //调用方法$.a1() $.extend({ a1: function () { console.log("a1&quo ...
- spring mvc: 多解析器映射(资源绑定视图解析器 + 内部资源[普通模式/]视图解析器)
spring mvc: 多解析器映射(资源绑定视图解析器 + 内部资源[普通模式/]视图解析器) 资源绑定视图解析器 + 内部资源(普通模式)视图解析器 并存方式 内部资源视图解析器: http:// ...
- snowflake机器标识自动绑定
首先附上snowflake源码 package com.yunyihenkey.common.idworker; /** * Twitter_Snowflake<br> * SnowFla ...
- FlexiGrid 使用 全选、自动绑定
1.介绍 Flexigrid是一个类似于Ext Gird,但基于jQuery开发的Grid.它具有的功能包括:可以调整列宽,合并列标题,分页,排序,显示/隐藏表格等.Flexigrid显示的数据能够通 ...
- WinForm开发-界面控件到实体,实体到界面控件自动绑定
在WinForm开发中,我们是不是为绑定界面控件的数据而每个控件每个控件的赋值?在保存修改时是不是也是每个控件每个控件的赋值到实体中?字段一多,那简直就是噩梦.有没有像Web中那样方便的方法直接就自动 ...
随机推荐
- java 文件的读写操作
java 文件的读写操作 一.读: public String getSetting() { HttpServletRequest request=org.apache.struts2.Servle ...
- jdk 1.6.0_39 下载
Java SE Development Kit 6u39 Product / File Description File Size Download password Linux x86 65.42 ...
- 本地化ASP.NET core模型绑定错误消息
默认错误消息: MissingBindRequiredValueAccessor A value for the '{0}' property was not provided. MissingKey ...
- IE兼容css3圆角的htc解决方法
IE兼容css教程3圆角的htc解决方法 现在css3的border-radius属性可以很方便的实现圆角功能,对网站前台人员无疑是一件喜事,但悲剧的是IE6/7/8并不支持,让我们弃新技术不用,是不 ...
- 文件上传之Ajax篇
AJAX上传文件 1.为什么要写这篇文章 楼主前几天去北京面试,聊起ajax上传文件, 面试官告之不能,遂讨论之,不得果,于是写下这篇文章,希望能和大家一起学习 2.正文 首先,要使用ajax上传文 ...
- Centos7安装MySQL8.0
请到这个地址看:https://www.cnblogs.com/kevingrace/p/10482469.html Centos7安装MySQL8.0 - 操作手册 一.yum安装方式: 卸载之前版 ...
- 【转】Automated Testing Detail Test Plan
Automated Testing Detail Test PlanAutomated Testing DTP Overview This Automated Testing Detail Test ...
- HDU5950 Recursive sequence 非线性递推式 矩阵快速幂
题目传送门 题目描述:给出一个数列的第一项和第二项,计算第n项. 递推式是 f(n)=f(n-1)+2*f(n-2)+n^4. 由于n很大,所以肯定是矩阵快速幂的题目,但是矩阵快速幂只能解决线性的问题 ...
- The MathType DLL cannot be found 一劳永逸的方法
可能会看到下面的情况,然后实际上我们也能用过外部打开直接使用,那要你何用? 于是,我们找到这个文件,删除就OK 反正我写完论文就卸载了...
- ORA-14517: Subpartition of index "string.string" is in unusable state
今天碰到个ORA-03113, 原因不明. 猜测因为某些table DDL操作过后导致index unuable的case, 然后进行analyze table, 再碰到ORA-14517. 最后通 ...